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 =」をエスケープして、解析され、定義されたものに正しく渡されるようにする方法があるはずだと思いますか?オペレーター。
問題は、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
respond_to?
メソッドを使用してメソッドが存在するかどうかを確認し、シンボルを渡すことができます。 bar.respond_to?(:foo=)
オブジェクトbar
にメソッドfoo=
があるかどうかを確認します。クラスのインスタンスがメソッドに応答するかどうかを知りたい場合は、クラス(またはモジュール)でmethod_defined?
を使用できます。 Foo.method_defined?(:bar=)
。
defined?
はメソッドではなく、オペランドの説明を返す演算子です(定義されていない場合はnilです。そのため、ifステートメントで使用できます)。オペランドには、定数、変数、割り当て、メソッド、メソッド呼び出しなど、任意の式を使用できます。defined?(foo=)
を実行したときに機能しない理由は、括弧、スキップのためです。それらは期待どおりに多かれ少なかれ動作するはずです。そうは言っても、defined?
はかなり奇妙な演算子であり、メソッドの存在をテストするために誰も使用しません。