ruby - 棘手的 ruby​​ 类初始化----为什么同一个类初始化输出不同?

标签 ruby class

看看这门课:

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 将评估为 bc

所以最后我们会有这个表达式:

@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/

相关文章:

javascript - 如何 - 如果 div 有子 div,则展开此 div?

javascript - 不能声明或修改变量

ruby-on-rails - 如何从 Redis 缓存中缓存的 JSON API 访问对象值?

ruby - 为什么我不能从 ruby​​ 中的选定键创建新的散列?

ruby-on-rails - Twilio Rails 项目的推荐结构?

ruby - 是否为 :include inside a sunspot/solr searchable method do anything?

Java类加载器: load same class twice

html - 我什么时候应该在 react 中使用 'className' 而不是 'class',反之亦然?

ruby - 将 jekyll 与 --watch 标志一起使用会导致构建错误

java - Java中的类中可以嵌套注解吗?