我试图找到一种方法来评估由函数和参数组成的表达式。问题是,我不希望将参数转换为字符串。
具体来说,我有x =" display_datetime" String类型,它采用Time类型的对象y。函数名是动态创建的,所以我不能只键入display_datetime(y)。
我尝试过的事情:
eval("#{x}(#{y})") - 这就是我通常会这样做的方式,但这会改变字符串的时间。 " display_datetime"的全部目的是自定义时间到字符串转换,所以这没有用
x.send(y) - 这不会编译,因为send意味着发送类函数,而不是函数参数。
x.constantize ... - 即使x包含类名,也无法编译。
最后两种方法并不理想。我觉得必须有更好的方法来实现前三种方法。
感谢任何反馈。
由于
答案 0 :(得分:3)
send
没有问题。这样做:
send(x, y)
答案 1 :(得分:2)
鉴于
s = "display_datetime" # function name, dynamic
y = Time.now # or some other Time object
某些对象o
响应display_datetime()
方法,您可以通过多种方式动态调用o.display_datetime
,至少:
o.send(s.intern, y) # => o.send(:display_datetime, y)
或者,
eval("o.#{s}(y)") # => eval("o.display_datetime(y)")
可替换地,
o.instance_eval("#{s}(y)") # => o.instance_eval("display_datetime(y)")
或者,如果您想要evalception,如果变量n
包含变量o
的名称:
n = 'o'
eval %Q(#{n}.send(:instance_eval, "\#{s}(y)"))