在教程 中 Rubymonk说:
“在 Ruby 中,就像在现实生活中一样,我们的世界充满了对象。一切都是对象——整数、字符、文本、数组——一切。”
但是 && 和 || 是运算符,运算符也是对象吗?如何检查?
这不是违背红宝石“一切都是对象”的哲学吗?
在教程 中 Rubymonk说:
“在 Ruby 中,就像在现实生活中一样,我们的世界充满了对象。一切都是对象——整数、字符、文本、数组——一切。”
但是 && 和 || 是运算符,运算符也是对象吗?如何检查?
这不是违背红宝石“一切都是对象”的哲学吗?
&&
和||
Tokens 是运算符和标记不是对象,它们是 Ruby 解析器定义的运算符&&
。||
如果您有兴趣,可以深入研究源代码以找到实际的定义和实现细节。为了帮助您入门,这里有一个正则表达式匹配,可帮助您开始查看源代码:
$ fgrep -n '%token tANDOP tOROP' ruby-1.9.3-p194/ext/ripper/ripper.y
719:%token tANDOP tOROP /* && and || */
运算符不是对象,Ruby 中的大多数运算符都是方法。
您可以通过运行irb
并查看public_methods
某个对象来检查它:
$ irb
irb(main):001:0> "a"=="b"
=> false
irb(main):002:0> "a".public_methods
=> [:<=>, :==,.........
那么问题中的运算符呢,&&
并且||
被硬编码到Ruby语言中,但是==
从Comparable
模块中混合在一起。
这取决于您如何定义“一切”。我个人永远不会声称 ruby 中的每个单独的概念都是一个对象。我想没有一个很好的定义来描述红宝石的工作原理。我认为你只需要接受 ruby 的方式,当你使用它时,它会变得很简单。
如果您想查看某物是否为对象,请尝试将其分配给变量,或对其调用方法。如果您尝试使用操作员执行此操作,则会收到错误消息。一个值得注意的例外是方法,它们不是对象而是返回对象。
请注意,对象的概念有些抽象。两个变量可以指向同一个对象。每个对象都由一个object_id
. 您可能会将 object_id 视为内存中的位置。或者,您可以将一个对象视为一所房子,多个地址簿可以包含该房子的地址。
# point 2 variables to the same object
>> s = t = 's'
=> "s"
>> s.object_id
=> 70269794388360
>> t.object_id
=> 70269794388360
# get the object by id (for demonstration only; I don't recommend using this in application code)
>> ObjectSpace._id2ref(70269794388360)
=> "s"
# modifying the object. both variables "see" the change
>> s << '_'
=> "s_"
>> t
=> "s_"
继续房子的类比,附加到一个字符串 via<<
就像把一把新椅子带进房子。每个按照地址簿到那所房子(使用地址)的人都会看到房子(对象)有新椅子。
ruby 语言设计者认为没有理由允许将运算符&&
视为对象。你能看出有什么理由允许吗?
在 Ruby 中,所有变量类型都引用对象(如 Python)。但是运算符不是对象。您可以通过尝试调用它们的 to_s() 方法来检查。
ruby 中的大多数 Operator 实际上都是方法调用。
2.+(3) # 5
这是一个很好的解释: http: //net.tutsplus.com/tutorials/ruby/ruby-for-newbies-operators-and-their-methods/