Ruby 如何为函数中的全局变量赋值?

Ruby 如何为函数中的全局变量赋值?,ruby,Ruby,我有一个从用户那里获取输入的函数 def get_single_argument(argument,name) begin puts "Type #{name}: " argument = STDIN.gets.chomp puts "#{name} --> #{argument} OK??" happy = STDIN.gets.downcase.chomp end until (happy.strip

我有一个从用户那里获取输入的函数

def get_single_argument(argument,name)

    begin
        puts "Type #{name}: "
        argument = STDIN.gets.chomp
        puts "#{name} --> #{argument} OK??"

        happy = STDIN.gets.downcase.chomp

    end until (happy.strip[0,1].to_s =='y' )
end
但是当我调用这个函数时,参数是一个全局变量,全局变量不会被更新。如何为作为函数参数传递的全局变量赋值$web\u url为“”-空字符串

       $web_url =''
       puts "url je:#{$web_url}"

       get_single_argument($web_url,"web url")
       puts "url je:#{$web_url}"
。相反,使
get\u single\u参数
返回以下值:

def get_single_argument(name)
    happy = "no"
    until happy.strip[0,1].to_s =='y'
        puts "Type #{name}: "
        argument = STDIN.gets.chomp
        puts "#{name} --> #{argument} OK??"

        happy = STDIN.gets.downcase.chomp
    end 
    argument
end

。相反,使
get\u single\u参数
返回以下值:

def get_single_argument(name)
    happy = "no"
    until happy.strip[0,1].to_s =='y'
        puts "Type #{name}: "
        argument = STDIN.gets.chomp
        puts "#{name} --> #{argument} OK??"

        happy = STDIN.gets.downcase.chomp
    end 
    argument
end


您可以在方法中使用
String.replace
。而不是

argument = STDIN.gets.chomp
你可以写

argument.replace STDIN.gets.chomp

您可以在方法中使用
String.replace
。而不是

argument = STDIN.gets.chomp
你可以写

argument.replace STDIN.gets.chomp
在此行之前:

argument = STDIN.gets.chomp
局部变量
参数
和全局变量
$web\u url
引用了计算机内存中的同一对象。执行该行后,变量
参数
现在引用的对象与
$web\u url
引用的对象不同

正如Howard提到的,使用
argument.replace(..)
将修改内存中的字符串对象,而不会中断变量和内存中对象之间的链接

通常,更好的方法不是使用全局变量,而是让方法返回用户输入。

在这一行之前:

argument = STDIN.gets.chomp
局部变量
参数
和全局变量
$web\u url
引用了计算机内存中的同一对象。执行该行后,变量
参数
现在引用的对象与
$web\u url
引用的对象不同

正如Howard提到的,使用
argument.replace(..)
将修改内存中的字符串对象,而不会中断变量和内存中对象之间的链接


一般来说,更好的方法是不使用全局变量,而是让方法返回用户输入。

谢谢您的解释,但我仍然不明白为什么在执行该行后它会引用其他对象。因为您在使用赋值(=)运算符时告诉
argument
引用其他对象。如果你写的是
argument=1
,你还会期望
argument
$web\u url
引用同一个对象吗?哦,好的,我不清楚。我不明白为什么在赋值给参数后的代码中全局变量的值没有更改。感谢您的解释,但我仍然不明白为什么在执行该行后它引用了其他对象。因为您在使用赋值(=)运算符时告诉
参数
引用其他对象。如果你写的是
argument=1
,你还会期望
argument
$web\u url
引用同一个对象吗?哦,好的,我不清楚。我不明白为什么在赋值给参数后的代码中全局变量的值没有改变。