+ @是什么意思作为ruby中的方法
我正在阅读一些代码,我看到了一些类似的东西
module M def +@ self end end
我很惊讶这是合法的语法,但当我在文件上运行ruby -c
(对于lint)时,它说它是有效的。 -@
也是一个合法的方法名称,但当我尝试*@
或d@
,这些都是非法的。 我想知道+@
是什么意思,为什么合法?
Ruby包含一些一元运算符,包括+
, -
, !
, ~
, &
和*
。 与其他运营商一样,您也可以重新定义这些运营商。 对于~
和!
你可以简单地说def ~
和def !
因为他们没有二元对应物(例如你不能说a!b
)。
但是对于-
和+
有一元和二元版本(例如a+b
和+a
都有效),所以如果你想重新定义一元版本,你必须使用def +@
和def -@
。
另请注意, *
和&
有一元版本,但它们有特殊含义。 因为*
它与splatting数组相关联,并且它与将对象转换为proc绑定在一起,因此如果要使用它们,则必须分别重新定义to_a
和to_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
)。