85

Ruby では、メソッド foo=(bar) を定義できます。

irb(main):001:0> def foo=(bar)
irb(main):002:1>   p "foo=#{bar}"
irb(main):003:1> end
=> nil

定義されているかどうかを確認したいのですが、

irb(main):004:0> defined?(foo=)
SyntaxError: compile error
(irb):4: syntax error, unexpected ')'
 from (irb):4
 from :0

ここで使用する適切な構文は何ですか? 「foo =」をエスケープして、解析されて定義済みに正しく渡される方法が必要だと思いますか?オペレーター。

4

2 に答える 2

137

問題は、foo=メソッドが割り当てで使用されるように設計されていることです。次のように使用defined?して、何が起こっているかを確認できます。

defined?(self.foo=())
#=> nil
defined?(self.foo = "bar")
#=> nil

def foo=(bar)
end

defined?(self.foo=())
#=> "assignment"
defined?(self.foo = "bar")
#=> "assignment"

それを比較してください:

def foo
end

defined?(foo)
#=> "method"

foo=メソッドが定義されているかどうかをテストするには、respond_to?代わりに次を使用する必要があります。

respond_to?(:foo=)
#=> false

def foo=(bar)
end

respond_to?(:foo=)
#=> true
于 2010-02-27T18:56:35.790 に答える
44

method を使用してメソッドが存在するかどうかを確認できます。たとえば、オブジェクトに method があるかどうかを確認するrespond_to?には、シンボルを渡します。クラスのインスタンスがクラス (またはモジュール) で使用できるメソッドに応答するかどうかを知りたい場合は、.bar.respond_to?(:foo=)barfoo=method_defined?Foo.method_defined?(:bar=)

defined?はメソッドではなく、オペランドの説明を返す演算子です (定義されていない場合は nil です。これが if ステートメントで使用できる理由です)。オペランドは、定数、変数、代入、メソッド、メソッド呼び出しなど、任意の式にすることができます。実行したときに機能しない理由defined?(foo=)は、括弧が原因であり、それらをスキップすると、より機能するはずです予想通り以下。そうは言ってdefined?も、かなり奇妙な演算子であり、メソッドの存在をテストするためにこれを使用する人は誰もいません。

于 2010-06-04T17:52:58.607 に答える