0

著者クラスがあります:

class Author < ActiveRecord::Base
  def to_s
    name
  end
end

定義to_sすることで私はできますがputs Author.first、できませんputs Author.first.rjust(10)

NoMethodError: undefined method `rjust' for #<Author:0x21eb5d4>

to_sこのような場合、Rubyが文字列メソッドの前に自動的に試行したほうがよいのではないでしょうか。この動作を取得する方法はありますか?

4

4 に答える 4

18

まず、いいえ、そうではありません。ルビーに「ねえ、これは文字列メソッドかもしれません。実行後に実行できるかどうかを確認させてくださいto_s」と任意のオブジェクトで言いたくありません。そうは言っても、やりたいことには2つの解決策があります。

Author「いずれにせよ、誰かが持っていないメソッドを呼び出したが、それがStringそうなら、魔法のように呼び出す必要があります」と言いたい場合は、次のようにto_sします。

class Author < ActiveRecord::Base
  def to_s
    name
  end

  def method_missing(s, *a)
    x = to_s
    if x.respond_to? s then
      return x.send(s, *a)
    else
      super
    end
  end
end

「文字列以外のものについては、最初にrjust呼び出すことを意味する必要があります」と言いたい場合は、次のようにします。to_s

class Object
  def rjust(*a)
    to_s.rjust(*a)
  end
end

(必要に応じて他の方法で繰り返します。これにより、次のようなことができることに注意してください86.rjust(10)。それが良いことかどうかは好みの問題かもしれません)

于 2009-06-13T23:40:43.040 に答える
2

こういう時はRubyが自動的に文字列メソッドの前にto_sを試みた方が良いのではないでしょうか?

「(ほとんどの場合)自分の言いたいことをするだけ」という言語を求めて、滑りやすい坂道を下っています。多くの場合、それは理にかなっているかもしれませんが、エッジの周りで物事を台無しにすることは間違いありません. あなたの場合、rjustは Author (またはそのスーパークラスの 1 つ) で定義されたメソッドではないと誰が言いますか。

于 2009-06-14T00:36:05.420 に答える