字符串转方法名

4
我似乎无法理解这个答案,但也许它与我尝试实现的内容不同。
我有一个字符串,该字符串可能会随时间而变化,我需要将该字符串转换为已定义的方法名:
action = "get_name"

# The method
def get_name
  puts "James"
end

# Calling the method
action # => undefined method `action' for main:Object

action可以是我定义的任何方法,名称以字符串格式呈现。我能说action.to_method,这意味着你明白我的意思 ;)

我不认为我能说action.to_sym

1个回答

4
method(action).call

或者

public_send(action)

例子:

method(action).call
#=> James
public_send(action)
#=> James

请注意,上述内容并不关心上下文和方法最初的定义位置,因此两者都将在当前对象的上下文中调用它。


@Sylar 不行,因为在这种情况下它不起作用。例如,使用 public_send 时应该像这样:public_send(action, a, b),其中 ab 是参数。 - Andrey Deineko
public_send()是最好的。谢谢! - Sylar
@Sylar,使用eval可以这样做:eval("action(1,2)"),其中的12是实际参数。但正如我们所知道的那样,eval是邪恶的,特别是当你从传入的参数中进行评估时,所以甚至不要考虑它! - Andrey Deineko
那么哪个是最安全的?public_send - Sylar
@Sylar,public_send 对于定义的方法范围也很关注,所以如果你试图使用 public_send 调用 private 方法,它会失败,而使用 send 则会调用它。因此,在干净的接口中,public_send 是最安全的选择。 - Andrey Deineko
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接