我了解到在Ruby中,对象只是一堆实例变量和类的链接(Metaprogramming Ruby 2,The Pragmatic Bookshelf)。
当我创建一个变量时,我创建一个类的实例并为其赋值。我认为这个值作为实例变量存储在对象中是错误的吗?当我调用instance_variables时,没有出现。例如:
str = "hello" # => "hello"
str.class # => String
str.instance_variables # => []
如果str
是一个对象并且它等于"hello"
,那么"hello"
存储在哪里?
答案 0 :(得分:2)
变量不是对象。它是一种编程语言构造,提供了一种在源代码中引用对象的方法。
例如,在下面的代码中,b
的初始化不创建一个新对象,只创建一个引用对象的新变量:
2.3.0 :012 > a = 'a string'
=> "a string"
2.3.0 :013 > b = a
=> "a string"
答案 1 :(得分:0)
正如Jan所指出的,某些Ruby类是特殊的。这意味着内部是用C实现的,而不是Ruby,所以它们对于通常的反射工具是不可见的。
您可以查看Ruby source内部,看看它是如何发挥作用的。
在string的情况下,没有存储字符串的实例变量,字符串本身是存储的位置。
答案 2 :(得分:0)
您所做的局部变量str
不是实例变量。
如果创建实例变量,那么它将存储在对象中。但是,对变量本身调用instance_variables
是没有意义的。您应该在存储它的对象上调用它(在这种情况下是隐式主上下文)。
@str = "hello"
instance_variables # => [:@str]