在根据用户输入动态调用方法时,使用case / when事物或send方法更好吗? “更好”主要基于良好的编码实践。
input = gets.chomp
case input
when foo
foo
when bar
bar
end
与
input = gets.chomp #Where hopefully the input would be 'foo' or 'bar'
send(input)
答案 0 :(得分:1)
你的措辞让这个问题难以理解。
如果我理解正确,您希望根据用户输入调用方法。另一种方法是检查每个可能的值并调用方法,另一种方法是直接使用send
。
首先,请注意,在您的第一个示例中,当用户输入method1
时,您正在呼叫foo
。如果您使用send(input)
,则会调用foo
。所以他们并不完全一样。
您可以通过将 input->方法映射放在哈希中来实现相同的行为:
dispatch = {foo: :method1, bar: :method2}
input = gets.chomp.to_sym
send(dispatch[input])
另外需要注意的是,原始情况下的send
会调用任何传递的方法。您可以使用上面的哈希值whitelist代替DRY并检查是否存在这样的值:
send(dispatch[input]) if dispatch.key? input
<小时/> 现在回到何时使用其中一个的问题:
答案 1 :(得分:0)
除非您希望您的用户能够调用方法查找链中的任何方法,包括发送可以调用的私有方法,否则将其锁定可能是有意义的并且只允许用户使用某些方法。
如果你没有指定要发送的对象(比如上面的代码),Ruby会查看self以获取该名称的方法,然后使用常规方法查找。换句话说, self 将是方法查找链中的第一个链接。如果您确实指定了一个对象,可能是您为此目的创建的对象,另一个选项可能是使用try或respond_to?等方法。
答案 2 :(得分:0)
input = gets.chomp
if defined?(input.to_sym)
send(input)
else
puts "No such thing!"