2016-06-28 32 views
1

我在使用Ruby中的数组进行更改时遇到了问题。该方法无法使用全局方法。我很困惑,并且会喜欢一些帮助。我如何从用户那里获得答案并使用该答案?使用Ruby的局部变量和方法

a = [1,2,3,4,5] 

puts "Pick number to insert into array:" 
number = gets.chomp() 

def insert(answer, number) 
    a.insert(1,number) 
end 

insert(answer,number) 

当然,我得到的错误:

methods.rb:13:in `insert': undefined local variable or method `a' for main:Object (NameError) 
    from methods.rb:16:in `<main>' 

回答

4

变量a未在insert方法的范围内定义。

有几种类型的红宝石变量,它们可以通过the following table来概括:

$   A global variable 
@   An instance variable 
[a-z] or _ A local variable 
[A-Z]  A constant 
@@   A class variable 

为了使您的代码工作,你既可以定义a作为一个全局变量(虽然这通常被认为是不好的做法):

$a = [1,2,3,4,5] 

puts "Pick number to insert into array:" 
answer = gets.chomp() 

def insert(answer) 
    $a.insert(1, answer) 
end 

insert(answer) 

或者,你可以在方法的范围内定义a

puts "Pick number to insert into array:" 
answer = gets.chomp() 

def insert(answer) 
    a = [1,2,3,4,5] 
    a.insert(1, answer) 
end 

insert(answer) 

或者,你可以通过a到方法的参数:

puts "Pick number to insert into array:" 
answer = gets.chomp() 

def insert(a, answer) 
    a.insert(1, answer) 
end 

a = [1,2,3,4,5] 
insert(a, answer) 

或者,你可以定义一个类,使a该类的实例变量 - 例如,类似:

class HelloWorld 
    attr_reader :a 
    def initialize 
    @a = [1,2,3,4,5] 
    end 

    def insert(answer) 
    @a.insert(1, answer) 
    end 
end 

puts "Pick number to insert into array:" 
answer = gets.chomp() 

my_awesome_object = HelloWorld.new 
my_awesome_object.insert(answer) 
puts my_awesome_object.a 
+0

在你的第三个例子中,你说或者,你可以传入一个方法作为参数: 这就是我正在做的,它不工作。 – arsenalist

+0

在你的原始代码中,你似乎有我的类型或省略的东西:什么是“答案”?那应该和'a'一样吗?如果没有完整的功能代码,我无法重现您的问题。 –

0

方法声明引入了新的范围。有很多方法可以完成一项任务,例如, G。与实例变量:

@a = [1,2,3,4,5] 

puts "Pick number to insert into array:" 
number = gets.chomp 

def insert(answer, number) 
    @a.insert(1,number) 
end 
0

方法insert不要有可变a。你必须在那里发送。所以修改这样的代码。

def insert(a, number) 
    a.insert(1,number) 
end 

insert(a, number) 

我希望这有助于

+0

其实文档显示a.insert为例... http://ruby-doc.org/core-2.3.1/Array.html#method-i-insert – arsenalist

+0

@arsenalist是的,但默认情况下或同样的范围不在方法中。 ;) –

0

不像块,方法做捕捉他们创造了大部分的环境,比对象范围等,如果一种方法在类中定义的。

在你的情况下,传递a明确地insert可以帮助:

def insert(a, answer, number) 
    a.insert(1, number) 
end 

如果ainsert去手牵手,一个良好的面向对象设计,可能是数据和行为封装成一个单独的类。不知道这是否是这种情况,但要记住。