在Ruby中,如何检查方法“foo=()”是否已定义?

bjg7j2ky  于 2023-05-22  发布在  Ruby
关注(0)|答案(2)|浏览(150)

在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=,这样它才能被解析并正确地传递给defined?运算符。

brvekthn

brvekthn1#

问题是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
jm2pwxwz

jm2pwxwz2#

你可以使用respond_to?方法来检查一个方法是否存在,并向它传递一个符号,例如。bar.respond_to?(:foo=)来查看对象bar是否有方法foo=。如果你想知道一个类的示例是否响应一个方法,你可以在这个类(或模块)上使用method_defined?,例如Foo.method_defined?(:bar=)
defined?不是一个方法,而是一个返回操作数描述的操作符(如果没有定义,则返回nil,这就是为什么它可以在if语句中使用)。操作数可以是任何表达式,即常量、变量、赋值、方法、方法调用等。当你执行defined?(foo=)时,它不工作的原因是因为括号,跳过它们,它应该或多或少地像预期的那样工作。话虽如此,defined?是一个非常奇怪的操作符,没有人用它来测试方法的存在性。

相关问题