无法访问作为参数

时间:2015-05-29 22:06:41

标签: ruby

我正在学习Ruby并且遇到了一些我不太了解的行为。在下面的示例代码中,我有两个until循环,每个循环都有自己的方法。执行until_test时,它会永久地输出10 20 10 20 10 20循环,但在执行second_until_test时,它的行为与我预期的一样,仅输出10 20。似乎由于某种原因代码现在的方式,我无法更改作为参数传递的变量。我知道这个问题的答案可能非常简单,但是在搜索了一段时间后,我没有弄明白或找到答案。正如我在until_test尝试的那样成功传递参数的正确方法是什么?

提前致谢!

def until_test
    num = 10
    until num == 20
        do_this(num)
    end
end

def second_until_test
    num = 10
    until num == 20
        puts num
        num = 20
        puts num
    end
end

def do_this(variable)
    puts variable
    variable = 20
    puts variable
end

4 个答案:

答案 0 :(得分:0)

我在这里解决了你的问题:



def until_test
    num = 10
    until num == 20
        num = do_this(num)
    end
end

def second_until_test
    num = 10
    until num == 20
        puts num
        num = 20
        puts num
    end
end

def do_this(variable)
    puts variable
    variable = 20
    puts variable
	return variable
end

until_test




答案 1 :(得分:0)

这里的问题是命名空间...在second_until_test中,num对方法有效,因此它将在untill循环中更改。

在until_test中,您将num作为参数传递给另一个方法,该方法不会直接更改传递的对象,除非您将num声明为方法的返回值:

interval - stopwatch.ElapsedMilliseconds

TLDR:until_test的num不会改变值,这就是它永远循环的原因。

答案 2 :(得分:0)

其他答案都是正确的。您在until_test中获得永久循环的原因是因为您的do_this方法未返回修改后的变量。调用puts并不返回传递的参数的值,而是nil,这意味着,您分配num的内容是nil而不是所需的修改输出:)< / p>

无论如何,只是分享另一种杀死猫的方法:)

在ruby中,有一些东西叫做实例变量。对脚本中的变量进行的任何修改,无论是其他方法,都将更改变量的值。可以通过在变量前加@来简单地声明它。您还可以使用$将其设为全局。谢谢埃里克指出哈哈哈......

在您的代码上实现此操作将如下所示:

@num
def until_test
    @num = 10
    until @num == 20
        do_this(@num)
    end
end

def second_until_test
    @num = 10
    until @num == 20
        puts @num
        @num = 20
        puts @num
    end
end

def do_this(variable)
    puts variable
    variable = 20
    @num = variable
    puts variable
end

答案 3 :(得分:0)

选择的答案是最好的答案,尽管Jason提供了另一种技术。

为了澄清Jason的答案,对象方法中定义的所有方法都可以访问实例变量,包括嵌套方法。

class Dog
  def dog_things
    @dog = "Rex"
    def bark
      puts "#{@dog} goes 'bark, bark'"
    end
    bark
  end
end

Dog.new.dog_things
=> "Rex goes 'bark, bark'"

在Ruby中,即使你没有定义任何类或对象,你仍然总是在一个对象中。它被称为main,它是Object类的对象。

puts self
=> main
puts self.class
=> Object

实例和全局变量之间的区别在于,如果定义一个类,则在创建类之前设置的实例变量在类中不可用(尽管它可以有另一个具有相同名称的实例变量)。

然而,全局变量一旦定义,就可以在所有类和外部类中随处访问。