看看这门课:
class Test
def initialize a, b, c
@a = a, @b = b, @c = c
end
end
class AnotherTest
def initialize a, b, c
@a = a
@b = b
@c = c
end
end
array = []
array.push Test.new "a1" ,"b1", "c1"
array.push AnotherTest.new "a2" ,"b2", "c2"
p array
我认为这应该是相同的,但不是:
<Test:0x000000022aba78 @b="b1", @c="c1", @a=["a1", "b1", "c1"]>
<AnotherTest:0x000000022ab9b0 @a="a2", @b="b2", @c="c2">]
谁能给我解释一下?
最佳答案
如果你在 irb 中尝试这个表达式:
a = "something" #=> "something"
如您所见,赋值操作返回结果,因为在 ruby 中每个表达式都应该返回一些东西。那么这个表达式:
@b = b #=> b
将返回 @b
的值。然后在这个表达式中
@a = a, @b = b, @c = c
其中 @b = b
和 @c = c
将评估为 b
和 c
所以最后我们会有这个表达式:
@a = a, b, c
正如你所知,它是数组初始化的另一种形式
@a = [a, b, c]
此代码将与您的代码等效:
class Test
def initialize a, b, c
@a = a, b, c
@b = b
@c = c
end
end
添加: 评估的顺序很重要。 如果你试试这个表达式:
@a = a, (@b = b, @c = c)
首先,它将评估括号中的所有内容:
@b = b, @c = c #=> @b = [b,c] and @c = c
那么我们就得到这个
@a = [a,[b,c]]
@b = [b,c]
@c = c
关于ruby - 棘手的 ruby 类初始化----为什么同一个类初始化输出不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9553451/