我正在学习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
答案 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
实例和全局变量之间的区别在于,如果定义一个类,则在创建类之前设置的实例变量在类中不可用(尽管它可以有另一个具有相同名称的实例变量)。
然而,全局变量一旦定义,就可以在所有类和外部类中随处访问。