4

我想知道,是、、、、基本核心&&不可 更改的功能(如在其他语言中,例如:php)还是它们是对象方法, 但定义了一些神奇的方式and||or& <=>

关于我的思想特征的更多细节:

[] & [10]
# => []

[].&([10])
# => []

"aaa".& 10
# NoMethodError: undefined method `&' for "aaa":String

注意它说未定义的方法

……当然可以。

true.& false
# => false

...但你不能这样做:

true.&& false
# SyntaxError:

所以如果有可能

class String
  # monkey patch. If you googled this don't use this in real world, use ruby mixins insted
  def &(right_side)
    # do something meaningfull
    right_side
  end
end

"aaa".& 10
# => 10     # ta-da!

有没有(有一些魔法)可以做:

class String
  # monkey patch. If you googled this don't use this in real world, use ruby mixins insted
  def &&(right side)
    # do something meaningfull
    right side
  end
end
# => SyntaxError: (irb):13: syntax error, unexpected keyword_end

谢谢

在此处输入图像描述

4

2 回答 2

3

这些是不能(重新)定义的运算符:

  • &&, || (与,或)
  • .., ... (范围)
  • ?:(三元)
  • 救援
  • =(和**=、&&=、&=、*=、+=。-=、<<=、>>=、||=、|=、^=)
  • 定义?
  • 不是
  • 和,或
  • 如果,除非,同时,直到

其他的,如(不完整列表)!、~、+、-、**、*、/、%、>>、==、!= 被实现为方法并且可以重新定义。

于 2013-06-19T12:44:02.770 回答
2

David A. Black在他的书中说:

[T] 条件赋值运算符||=,以及它很少见的表亲 &&=,它们都提供与伪运算符方法相同的快捷方式,但基于运算符,即||and &&,您无法覆盖。

现在进入原因请看和阅读Why can't we override|| and&&?Operator Overloading.

于 2013-06-19T12:27:28.563 回答