Ruby的局部变量和方法

时间:2016-06-28 13:20:14

标签: 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 个答案:

答案 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

如果ainsert齐头并进,那么一个好的OO设计可能就是将这些数据和行为封装到一个单独的类中。不确定这是否属于这种情况,但要记住一些事情。