【问题标题】:What does +@ mean as a method in ruby+@ 作为 ruby​​ 中的方法是什么意思
【发布时间】:2016-10-16 15:57:23
【问题描述】:

我正在阅读一些代码,我看到了一些类似于

的内容
module M
  def +@
    self
  end
end

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

【问题讨论】:

    标签: ruby operator-overloading unary-operator


    【解决方案1】:

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

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

    另请注意,*& 也有一个一元版本,但它们具有特殊含义。对于*,它与喷溅数组相关联,对于&,它与将对象转换为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​​ &lt;=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 不同,因为自该版本以来为字符串定义了一元减号和加号,它们指的是从原始字符串返回一个冻结和未冻结的字符串。

    【讨论】:

    • 体面的解释,+1
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 2016-08-17
      • 2016-09-17
      • 2021-11-10
      • 2011-01-11
      • 2012-01-05
      • 2020-04-27
      • 1970-01-01
      • 2011-10-14
      相关资源
      最近更新 更多