【发布时间】:2013-07-27 10:32:51
【问题描述】:
我在 pry REPL 中闲逛,发现了一些非常有趣的行为:波浪号方法。
似乎 Ruby 语法有一个内置的文字一元运算符 ~,只是闲置。
这意味着~Object.new 将消息~ 发送到Object 的实例:
class Object
def ~
puts 'what are you doing, ruby?'
end
end
~Object.new #=> what are you doing, ruby?
这看起来很酷,但很神秘。 Matz 是否本质上是想给我们自己的可定制的一元运算符?
我可以在 rubydocs 中找到的唯一参考是在 operator precedence 注释中,它与 ! 和 unary + 一起被列为第一高优先级运算符,这对于一元运算符是有意义的。 (有关接下来两个优先级的有趣勘误表,** 然后unary -,请查看this question。)除此之外,没有提及此实用程序。
在~=,!~, and~>` 的问题中,我可以通过搜索找到对这个运算符的两个值得注意的引用,它们是this 和this。他们都注意到了它的有用性、怪异和晦涩,却没有深入探讨它的历史。
在我即将注销 ~ 作为为您的对象提供自定义一元运算符行为的一种很酷的方式之后,我找到了它在 ruby 中实际使用的地方--fixnum(整数)。
~2 返回-3。 ~-1 返回1。所以它否定一个整数并减去一个......出于某种原因?
任何人都可以告诉我波浪号运算符在整个 ruby 中的独特和意外行为的目的吗?
【问题讨论】:
标签: ruby syntax operators literals