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

时间:2011-12-26 10:30:19

标签: 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[0,1].to_s =='y' )
end

但是当我调用这个参数是全局变量的函数时,全局变量不会更新。如何为全局变量赋值,该变量名称作为函数参数传递? $ web_url是'' - 空字符串。

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

       get_single_argument($web_url,"web url")
       puts "url je:#{$web_url}"

3 个答案:

答案 0 :(得分:2)

Don't use global variables。而是让get_single_argument返回值:

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

web_url = get_single_argument("web url")

答案 1 :(得分:2)

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

argument = STDIN.gets.chomp

你可以写

argument.replace STDIN.gets.chomp

答案 2 :(得分:1)

在此之前:

argument = STDIN.gets.chomp

局部变量argument和全局变量$web_url确实引用了计算机内存中的同一个对象。执行该行后,变量argument现在引用的是与$web_url引用的对象不同的对象。

正如霍华德所提到的,使用argument.replace(..)将修改内存中的String对象,而不会破坏变量与内存中对象之间的链接。

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