2

在教程 中 Rubymonk说:

“在 Ruby 中,就像在现实生活中一样,我们的世界充满了对象。一切都是对象——整数、字符、文本、数组——一切。”

但是 && 和 || 是运算符,运算符也是对象吗?如何检查?

这不是违背红宝石“一切都是对象”的哲学吗?

4

5 回答 5

4

The&&||Tokens 是运算符

和标记不是对象,它们是 Ruby 解析器定义的运算符&&||如果您有兴趣,可以深入研究源代码以找到实际的定义和实现细节。为了帮助您入门,这里有一个正则表达式匹配,可帮助您开始查看源代码:

$ fgrep -n '%token tANDOP tOROP' ruby-1.9.3-p194/ext/ripper/ripper.y
719:%token tANDOP tOROP /* && and || */
于 2012-08-02T16:06:08.350 回答
1

运算符不是对象,Ruby 中的大多数运算符都是方法。

您可以通过运行irb并查看public_methods某个对象来检查它:

$ irb
irb(main):001:0> "a"=="b"
=> false
irb(main):002:0> "a".public_methods
=> [:<=>, :==,.........

那么问题中的运算符呢,&&并且||被硬编码到Ruby语言中,但是==Comparable模块中混合在一起。

于 2012-08-02T16:07:26.643 回答
1

这取决于您如何定义“一切”。我个人永远不会声称 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 语言设计者认为没有理由允许将运算符&&视为对象。你能看出有什么理由允许吗?

于 2012-08-02T18:09:16.767 回答
0

在 Ruby 中,所有变量类型都引用对象(如 Python)。但是运算符不是对象。您可以通过尝试调用它们的 to_s() 方法来检查。

于 2012-08-02T15:56:13.857 回答
0

ruby 中的大多数 Operator 实际上都是方法调用。

2.+(3)  # 5

这是一个很好的解释: http: //net.tutsplus.com/tutorials/ruby/ruby-for-newbies-operators-and-their-methods/

于 2012-08-02T16:12:10.273 回答