我在使用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>'
答案 0 :(得分:5)
变量a
未在insert
方法范围内定义。
ruby中有几种类型的变量,可以通过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
答案 1 :(得分: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
答案 2 :(得分:0)
方法insert
没有变量a
。你必须把它发送到那里。所以修改这样的代码。
def insert(a, number)
a.insert(1,number)
end
insert(a, number)
我希望这会有所帮助
答案 3 :(得分:0)
与块不同,方法不捕获它们在大多数情况下创建的环境,而不是在对象范围内,如果在类中定义了方法。
在您的情况下,明确将a
传递给insert
会有所帮助:
def insert(a, answer, number)
a.insert(1, number)
end
如果a
和insert
齐头并进,那么一个好的OO设计可能就是将这些数据和行为封装到一个单独的类中。不确定这是否属于这种情况,但要记住一些事情。