代码之家  ›  专栏  ›  技术社区  ›  fflyer05

Ruby变量(数组)赋值错误(使用push方法)

  •  2
  • fflyer05  · 技术社区  · 15 年前

    #!/usr/bin/ruby -w
    @instance_ar = [1,2,3,4]
    local_ar = @instance_ar
    local_ar_2 = local_ar
    ###
    irrelevant_local_ar = [5,6,7,8]
    ###
    for i in irrelevant_local_ar
        local_ar_2.push(i)
    end
    count = 0
    for i in local_ar_2
        puts "local_ar_2 value: #{i} and local_ar value: #{local_ar[count]} and @instance_ar value: #{@instance_ar[count]}\n"
        count += 1
    end
    

    它的输出是

    local_ar_2 value: 1 and local_ar value: 1 and @instance_ar value: 1
    local_ar_2 value: 2 and local_ar value: 2 and @instance_ar value: 2
    local_ar_2 value: 3 and local_ar value: 3 and @instance_ar value: 3
    local_ar_2 value: 4 and local_ar value: 4 and @instance_ar value: 4
    local_ar_2 value: 5 and local_ar value: 5 and @instance_ar value: 5
    local_ar_2 value: 6 and local_ar value: 6 and @instance_ar value: 6
    local_ar_2 value: 7 and local_ar value: 7 and @instance_ar value: 7
    local_ar_2 value: 8 and local_ar value: 8 and @instance_ar value: 8
    

    push local_ar_2 更改其他两个数组?我对局部变量的理解是,一旦它们被创建,它们就不应该影响任何其他变量,因为它们是局部的。

    来自C和Perl,这让我大吃一惊。

    2 回复  |  直到 15 年前
        1
  •  9
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

    Ruby与引用一起工作!记住这一点。如果你想要一份拷贝,你必须这样做:

    @instance_ar = [1,2,3,4]
    local_ar = @instance_ar.clone
    local_ar_2 = local_ar.clone
    

    编辑:

    a = ["a", "b", "c"]
    b = a[0]
    b = "d" # We assign a new object to b!
    

    a 是:

    但是:

    a = ["a", "b", "c"]
    b = a[0]
    b[0] = "d" # We are working with the reference!
    
    a is:
    => ["d", "b", "c"]
    
    a = "hello"
    b = a
    b += " world" 
    # Is the same as b = b + " world", we assign a new object!
    

    是: =>“你好”

    a = "hello"
    b = a
    b<<" world"
    # We are working with the reference!
    

    a = "abc"
    b = a
    b[0] = "d" # we are working with the reference
    

    是: =>“dbc”

    http://ruby-doc.org/docs/ProgrammingRuby/ . 向下滚动到几乎在页面底部的“变量”。

        2
  •  3
  •   Mladen Jablanović    15 年前

    在Ruby中,您并不“创建变量”,而是创建对象(在您的例子中是数组),并将它们分配给变量。所以,在你的例子中,你有一个有两个名字的数组, local_ar local_ar_2 . 之后你改变了对象,而不是变量(它们仍然指向同一个被改变的对象)。

    你说你来自C,看看这个例子:

    int a[5];
    int * b;
    
    a[0] = 10;
    a[1] = 20;
    b = a;
    b[1] = 5;
    
    printf("%d", a[1]);
    

    打印什么号码?这与Ruby代码中发生的情况几乎相同。

    for 因为遍历数组在Ruby中不是惯用的。通常使用:

    local_ar_2.each_with_index do |i, count|
        puts "local_ar_2 value: #{i} and local_ar value: #{local_ar[count]} and @instance_ar value: #{@instance_ar[count]}\n"
    end
    
    推荐文章