Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 无法访问作为参数传递的方法中的变量_Ruby - Fatal编程技术网

Ruby 无法访问作为参数传递的方法中的变量

Ruby 无法访问作为参数传递的方法中的变量,ruby,Ruby,我目前正在学习Ruby,遇到了一些我不太理解的行为。在下面的示例代码中,我有两个until循环,每个循环都有自己的方法。当执行直到\u test时,它将永远输出一个102020循环,但当执行second\u直到\u test时,它的行为与我预期的一样,只输出1020。似乎由于某种原因,现在的代码是这样的,我无法更改作为参数传递的变量。我知道这个问题的答案很简单,但我在搜索了一段时间后,没有找到答案。在测试之前,我尝试在中成功传递参数的正确方法是什么 提前谢谢 def until_test

我目前正在学习Ruby,遇到了一些我不太理解的行为。在下面的示例代码中,我有两个until循环,每个循环都有自己的方法。当执行
直到\u test
时,它将永远输出一个
102020
循环,但当执行
second\u直到\u test
时,它的行为与我预期的一样,只输出
1020
。似乎由于某种原因,现在的代码是这样的,我无法更改作为参数传递的变量。我知道这个问题的答案很简单,但我在搜索了一段时间后,没有找到答案。在测试之前,我尝试在
中成功传递参数的正确方法是什么

提前谢谢

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

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

def直到_测试
num=10
直到num==20
num=执行此操作(num)
结束
结束
def第二次_直到_测试
num=10
直到num==20
放置num
num=20
放置num
结束
结束
def do_此(变量)
放置变量
变量=20
放置变量
返回变量
结束

在测试之前,这里的问题是名称空间。。。在second_until_测试中,num对该方法有效,因此它将在untill循环中更改

在until_测试中,将num作为参数传递给另一个方法,该方法不会直接更改传递的对象,除非将num断言为该方法的返回值:

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

def do_this(variable)
  puts 20
  variable = 20
  # this method has to return the value for num
  variable # or return variable, or return 20...
end

TLDR:除非测试的num不改变值,否则它将永远循环。

其他答案都是正确的。之所以在
until\u test
中得到一个永久循环,是因为
do\u this
方法不会返回修改后的变量。调用puts不会返回所传递参数的值,而是
nil
,因此这意味着您分配的
num
nil
,而不是所需的修改输出:)

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

在ruby中,有一种称为实例变量的东西。在脚本中对变量所做的任何修改(无论是其他方法)都将更改变量的值。只需在变量前面加上一个
@
即可声明。您还可以使用
$
将其设置为全局。谢谢Eric指出这一点哈哈哈

在您的代码上实现此功能将如下所示:

@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

选择的答案是最好的,尽管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
实例变量和全局变量之间的区别在于,如果定义一个类,则在创建该类之前设置的实例变量在该类中不可用(尽管它可以有另一个同名的实例变量)


然而,一旦定义了全局变量,就可以在所有类和类外的任何地方访问它

可能重复的请不要只提供工作解决方案,请尝试解释为什么这样做。全局变量的前缀不是
$
?我想你说的是一个实例变量(
@
)本质上就像一个全局变量,如果它是在使用它们的方法之前和之外定义的?谢谢你的回复,顺便说一句。我会投你一票,但还没有足够的分数!哦,哈哈哈。。。谢谢你的更正。。是的,我的意思是一个实例变量:)无论如何,一个全局变量的工作原理是一样的:)让我编辑一下,哈哈哈