Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在使用send调用方法之前,请检查是否定义了字符串中命名的方法_Ruby_Metaprogramming - Fatal编程技术网

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更新了答案,请看一下