gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:52:16 26 4
gpt4 key购买 nike

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

module M
def +@
self
end
end

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

最佳答案

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

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

另请注意,* 有一个一元版本和 &同样,但它们具有特殊的含义。对于 *它与 splatting 数组有关,对于 &它与将对象转换为过程有关,所以如果你想使用它们,你必须重新定义 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 - +@ 作为 ruby​​ 中的方法是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40072250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com