+ @是什么意思作为ruby中的方法

我正在阅读一些代码,我看到了一些类似的东西

module M def +@ self end end 

我很惊讶这是合法的语法,但当我在文件上运行ruby -c (对于lint)时,它说它是有效的。 -@也是一个合法的方法名称,但当我尝试*@d@ ,这些都是非法的。 我想知道+@是什么意思,为什么合法?

Ruby包含一些一元运算符,包括+-!~&* 。 与其他运营商一样,您也可以重新定义这些运营商。 对于~! 你可以简单地说def ~def ! 因为他们没有二元对应物(例如你不能说a!b )。

但是对于-+有一元和二元版本(例如a+b+a都有效),所以如果你想重新定义一元版本,你必须使用def +@def -@

另请注意, *&有一元版本,但它们有特殊含义。 因为*它与splatting数组相关联,并且它与将对象转换为proc绑定在一起,因此如果要使用它们,则必须分别重新定义to_ato_proc

这是一个更完整的示例,显示了所有类型的一元运算符:

 class SmileyString < String def +@ SmileyString.new(self + " :)") end def -@ SmileyString.new(self + " :(") end def ~ SmileyString.new(self + " :~") end def ! SmileyString.new(self + " :!") end def to_proc Proc.new { |a| SmileyString.new(self + " " + a) } end def to_a [SmileyString.new(":("), self] end end a = SmileyString.new("Hello") p +a # => "Hello :)" p ~a # => "Hello :~" p *a # => [":(", "Hello"] p !a # => "Hello :!" p +~a # => "Hello :~ :)" p *+!-~a # => [":(", "Hello :~ :( :! :)"] p %w{:) :(}.map &a # => ["Hello :)", "Hello :("] 

在你的例子中,模块只是简单地定义一个一元+运算符,其默认值是对对象没有做任何事情(这是一元加号的常见行为, 5+5通常意味着相同的事情)。 混入任何类都意味着该类立即获得使用一元加运算符的支持,这将不会做任何事情。

例如(使用ruby <=2.2 ):

 module M def +@ self end end p +"Hello" # => NoMethodError: undefined method `+@' for "Hello":String class String include M end p +"Hello" # => "Hello" 

请注意,在此示例中,您可以从错误消息中清楚地看到类中缺少+@方法

请注意,上面的示例与Ruby 2.3不同,因为从该版本开始为字符串定义了一元减号和加号,它们指的是从原始字符串返回冻结和未冻结的字符串。

方法名+@-@用于在Ruby(1.9+)中重载一元运算符+- 。 一元运算符是仅采用单个值的运算符(例如, value = -value )。