首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ruby eval元编程技巧

ruby eval元编程技巧
EN

Stack Overflow用户
提问于 2013-07-19 07:38:09
回答 2查看 561关注 0票数 1

我试图找到一种方法来计算由函数和参数组成的表达式。问题是,我不想把参数转换成字符串。

具体来说,我有字符串类型的函数x="display_datetime“,它接受类型为Time的对象y。函数名是动态创建的,所以我不能只输入display_datetime(y)。

我试过的是:

  • eval("#{x}(#{y})") --我通常是这样做的,但这会将时间转换为字符串。"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采用一个参数。我不知道如何调用发送(或尝试)时,被发送的参数必须采取一个论点
  • 我的另一个想法是重写Time类,向其添加像to_s这样的转换函数,但这不需要任何参数。

最后两种方法并不理想。我觉得必须有一些更好的方法来做到这一点,按照前3种方法。

如有任何反馈,将不胜感激。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-19 07:41:59

send没有问题。这样做:

代码语言:javascript
复制
send(x, y)
票数 3
EN

Stack Overflow用户

发布于 2013-07-19 10:05:38

给定的

代码语言:javascript
复制
s = "display_datetime" # function name, dynamic
y = Time.now           # or some other Time object

有些对象o响应display_datetime()方法,您可以通过几种方式动态调用o.display_datetime,至少:

代码语言:javascript
复制
o.send(s.intern, y)    # => o.send(:display_datetime, y)

或,

代码语言:javascript
复制
eval("o.#{s}(y)")      # => eval("o.display_datetime(y)")

或者,

代码语言:javascript
复制
o.instance_eval("#{s}(y)") # => o.instance_eval("display_datetime(y)")

或者如果您想要evalception,如果变量n包含变量o的名称

代码语言:javascript
复制
n = 'o'
eval %Q(#{n}.send(:instance_eval, "\#{s}(y)"))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17740595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档