Ruby 在使用send调用方法之前,请检查是否定义了字符串中命名的方法
因此,如果输入错误,我想首先检查该方法是否存在;比如:Ruby 在使用send调用方法之前,请检查是否定义了字符串中命名的方法,ruby,metaprogramming,Ruby,Metaprogramming,因此,如果输入错误,我想首先检查该方法是否存在;比如: #!/usr/bin/env ruby def say_hi puts 'hi' end greeting = 'say_hi' send greeting # works greeting = 'say_hix' send greeting # undefined method `say_hix' for main:Object (NoMethodError) 你可以用 如果obj响应给定的方法,则返回true。只有当可选
#!/usr/bin/env ruby
def say_hi
puts 'hi'
end
greeting = 'say_hi'
send greeting # works
greeting = 'say_hix'
send greeting # undefined method `say_hix' for main:Object (NoMethodError)
你可以用
如果obj响应给定的方法,则返回true。只有当可选的第二个参数的计算结果为true时,才会在搜索中包括Private和protected方法
你有什么反应?不起作用
我用IRB尝试了以下方法,效果很好:
respond_to?(greeting)
你能在文件里试试吗
如文档所述,respond\u to?
仅当您传递第二个可选参数且其计算结果为true
时才包括私有和受保护的方法。由于say_hi
是一个私有方法,因此需要传入第二个可选参数:
2.6.3 :001 > def say_hi
2.6.3 :002?> puts 'hi'
2.6.3 :003?> end
=> :say_hi
2.6.3 :004 > greeting = 'say_hi'
=> "say_hi"
2.6.3 :005 > send greeting if respond_to?(greeting)
hi
=> nil
2.6.3 :006 > greeting = 'say_hix'
=> "say_hix"
2.6.3 :007 > send greeting if respond_to?(greeting)
=> nil
你可以用
如果obj响应给定的方法,则返回true。只有当可选的第二个参数的计算结果为true时,才会在搜索中包括Private和protected方法
你有什么反应?不起作用
我用IRB尝试了以下方法,效果很好:
respond_to?(greeting)
你能在文件里试试吗
如文档所述,respond\u to?
仅当您传递第二个可选参数且其计算结果为true
时才包括私有和受保护的方法。由于say_hi
是一个私有方法,因此需要传入第二个可选参数:
2.6.3 :001 > def say_hi
2.6.3 :002?> puts 'hi'
2.6.3 :003?> end
=> :say_hi
2.6.3 :004 > greeting = 'say_hi'
=> "say_hi"
2.6.3 :005 > send greeting if respond_to?(greeting)
hi
=> nil
2.6.3 :006 > greeting = 'say_hix'
=> "say_hix"
2.6.3 :007 > send greeting if respond_to?(greeting)
=> nil
谢谢你的回答,但除非我弄错了,
回复?
不起作用。我两种都试过:greeting='say_hi';如果回复,发送问候语?(问候语)
和问候语='say_hix';如果回复?(问候语)
,则发送问候语。我的代码只是一个基本脚本say_hi
未在类中定义。@user664833我已用一个更新了答案。谢谢,很抱歉给您添麻烦。我同意它在控制台工作。你能在文件里试试吗?我使用chmod 700/tmp/x.rb使其可执行,然后简单地运行/tmp/x.rb
。我使用的是Ruby 2.6.6。@user664833更新了答案,请查看它感谢您的答案,但除非我弄错了,respond\u to?
不起作用。我两种都试过:greeting='say_hi';如果回复,发送问候语?(问候语)
和问候语='say_hix';如果回复?(问候语)
,则发送问候语。我的代码只是一个基本脚本say_hi
未在类中定义。@user664833我已用一个更新了答案。谢谢,很抱歉给您添麻烦。我同意它在控制台工作。你能在文件里试试吗?我使用chmod 700/tmp/x.rb使其可执行,然后简单地运行/tmp/x.rb
。我正在使用Ruby 2.6.6。@user664833更新了答案,请看一下