如何解决在Ruby的if语句运算符中使用变量
我有一个包含'&&'
或'||'
的变量,我需要在if语句中使用它。
operator = '&&'
result = 1===1 operator 2===2
#=> result = 1===1 && 2===2
我该如何实现?
我尝试使用#public_send
,但无济于事。
任何帮助将不胜感激。
解决方法
&&
运算符比方法调用的&
和|
更具底层语法元素。这使它变得更难。
但是,有两种方法:
a = true
b = false
c = true
如果要与&&
等价:
[ a,b,c ].all?
# => false
[ a,c ].all?
# => true
如果要与||
等价:
[ a,c ].any?
# => true
[ a,b ].any?
# => true
[ b ].any?
# => false
,
您可以这样做:
operator = "&&"
result = eval "1===1 #{operator} 2===2"
那是你想要的吗?
或者如果1===1
在这里只是某个表达式的占位符,请将结果分配给变量,因此:
operator = "&&"
a = 1===1
b = 2===2
result = eval "#{a} #{operator} #{b}"
(当然,正如评论者所指出的,您必须注意eval
的安全漏洞,例如,检查运算符是否为"&&"
或"||"
。)
,如果您确实要使用if
语句:
if operator == '&&'
1===1 && 2===2
elsif operator == '||'
1===1 || 2===2
else
# dunno
end
,
您可以使用public_send,但是即使&&允许使用它,也没有意义。请注意,E1 && E2
短路是因为如果E1已经虚假,则不会评估E2。 public_send
如何使用?
如果要获得此效果,则必须放弃短路,这意味着必须使用&
和|
而不是&&
和||
。如果您坚持认为变量operator
包含类似'&&'
的内容,而不是说:&
(这会更有意义),则可以执行
result = (1===1).public_send(operator[0],2===2)
以您的示例进行演示。
更新:塔德曼对我的回答的评论使我认为我应该警告您注意以下陷阱:根据您的问题,我认为要与运算符连接的参数是true
或false
。在这种情况下,我的解决方案确实应该有效。但是,如果它们只能是某个类 X 的任何 truey 或 falsy 值,则需要将它们转换为 true 或 false ,因为否则,运算符可能会有不同的解释(例如,如果您的操作数恰好是整数)。因此,对于某些通用操作数_e1_和 e2 ,如果它们是false
或nil
,则应按照Ruby中的通用规则将其解释为false。否则,计算结果的安全方法是
result = (!!e1).public_send(operator[0],!!e2)
其中!!
确保将表达式转换为true
和false
,以便可以安全地应用运算符&
和|
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。