【发布时间】:2013-07-19 07:38:09
【问题描述】:
我正在尝试找到一种方法来评估由函数和参数组成的表达式。问题是,我不希望将参数转换为字符串。
具体来说,我有一个字符串类型的函数 x="display_datetime",它接受一个时间类型的对象 y。函数名是动态创建的,所以我不能只输入 display_datetime(y)。
我尝试过的:
eval("#{x}(#{y})") - 这是我通常的做法,但这会将 Time 转换为字符串。 “display_datetime”的全部目的是进行自定义时间到字符串的转换,所以这没有用
x.send(y) - 这不会编译,因为 send 旨在发送类函数,而不是函数参数。
x.constantize... - 即使 x 包含类名,也无法编译。
- y.send(:to_s(:datetime)) 这种方法不太理想,但我仍然无法让它发挥作用。 display_datetime 只是调用 y.to_s(:datetime),所以我尝试将动态生成的函数名称 x 简单地设置为 .to_s(:datetime),然后使用 send 命令在 y 上调用 x。这会起作用,除了 to_s 需要一个参数这一事实。当要发送的参数必须带参数时,我不知道如何调用 send(或 try)
- 我的另一个想法是重写 Time 类,向它添加一个转换函数,如 to_s,但这不需要任何参数。
最后两种方法不太理想。我觉得按照前 3 种方法,必须有更好的方法来做到这一点。
感谢任何反馈。
谢谢
【问题讨论】:
-
你在哪个命名空间下创建了
display_datetime -
在ApplicationHelper下
-
抱歉没有回复帖子。这不知何故从雷达上消失了。我现在就回复。
标签: ruby-on-rails ruby metaprogramming eval