web-dev-qa-db-ja.com

Rubyでは、メソッド "foo =()"が定義されているかどうかを確認するにはどうすればよいですか?

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 =」をエスケープして、解析され、定義されたものに正しく渡されるようにする方法があるはずだと思いますか?オペレーター。

70
Alex Boisvert

問題は、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
118
molf

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

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

35
Theo