Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby变量不起作用_Ruby_Instantiation_Instance Variables - Fatal编程技术网

Ruby变量不起作用

Ruby变量不起作用,ruby,instantiation,instance-variables,Ruby,Instantiation,Instance Variables,我在递增变量时遇到问题。这看起来非常琐碎和简单,但由于某种原因,我无法让它工作 我有一个程序在网格上移动一个机器人,它完全工作了。我现在只想数一数他走了多少步 这是我的密码: Class Robot @counter = 0 def move @counter +=1 end def print puts "Hurray the Markov chain has worked in #{@counter}" end 我得到一个错误,说未定义的方法“+”运算符。我也试过了

我在递增变量时遇到问题。这看起来非常琐碎和简单,但由于某种原因,我无法让它工作

我有一个程序在网格上移动一个机器人,它完全工作了。我现在只想数一数他走了多少步

这是我的密码:

Class Robot

 @counter = 0
 def move
  @counter +=1
 end

 def print
  puts "Hurray the Markov chain has worked in #{@counter}"
 end
我得到一个错误,说未定义的方法“+”运算符。我也试过了

@counter = @counter + 1
我做错了什么?

您的
@计数器
变量为零,因为它没有在第3行设置

正如tomsoft指出的,变量实际上是定义的,但它是在类上定义的,而不是类的实例(单个机器人)

要在类的实例上定义变量,需要在初始化器方法中初始化
@counter
变量

class Robot
  def initialize
    @counter = 0
  end

  def move
    @counter +=1
  end

  def print
    puts "Hurray the Markov chain has worked in #{@counter}"
  end
end
您的
@计数器
变量为零,因为它未在第3行设置

正如tomsoft指出的,变量实际上是定义的,但它是在类上定义的,而不是类的实例(单个机器人)

要在类的实例上定义变量,需要在初始化器方法中初始化
@counter
变量

class Robot
  def initialize
    @counter = 0
  end

  def move
    @counter +=1
  end

  def print
    puts "Hurray the Markov chain has worked in #{@counter}"
  end
end

您定义它的方式是@counter成为一个类变量,而不是一个实例变量

class Robot
   @counter=0  # you are in class definition, not instance
   def self.print_counter
      puts @counter
   end
end
Robot.print_counter
返回

0
唯一的选择是在初始化器方法中定义它

class Robot
  def initialize
     @counter=0
 end
end

您定义它的方式是@counter成为一个类变量,而不是一个实例变量

class Robot
   @counter=0  # you are in class definition, not instance
   def self.print_counter
      puts @counter
   end
end
Robot.print_counter
返回

0
唯一的选择是在初始化器方法中定义它

class Robot
  def initialize
     @counter=0
 end
end
TL;博士 类是可执行代码。设置实例变量通常必须在实例方法中完成。初始化由#new方法调用,该方法是在类中定义“initialize”时创建的

正在初始化Robot的实例变量#新建 例如:

class Robot
  def initialize
    @counter = 0
  end

  def move
    @counter += 1
  end

  def print
    puts "Hurray the Markov chain has worked in #{@counter}"
  end
end

robot = Robot.new
robot.move
robot.print
def move
  @counter.to_i.succ
end
将打印您期望的内容:

万岁马尔可夫链在1

无显式初始值设定项的机器人编码 编码通常是风格的问题,如何编码不仅取决于你想做什么,还取决于你想传达什么。在这种情况下,您可以在不使用显式初始值设定项的情况下重写类,方法是在尝试递增@counter之前确保将其设置为零。例如:

class Robot
  def initialize
    @counter = 0
  end

  def move
    @counter += 1
  end

  def print
    puts "Hurray the Markov chain has worked in #{@counter}"
  end
end

robot = Robot.new
robot.move
robot.print
def move
  @counter.to_i.succ
end
这将确保如果@counter为nil,它将被转换为整数(在本例中为零),然后递增。这对一些人来说可能有点“神奇”,所以你也可能会看到人们对零防护的态度更加明确:

def move
  @counter ||= 0
  @counter  += 1
end
如果@counter为nil或false,则为其赋值为零。这确保您能够根据其值调用数值方法。

TL;博士 类是可执行代码。设置实例变量通常必须在实例方法中完成。初始化由#new方法调用,该方法是在类中定义“initialize”时创建的

正在初始化Robot的实例变量#新建 例如:

class Robot
  def initialize
    @counter = 0
  end

  def move
    @counter += 1
  end

  def print
    puts "Hurray the Markov chain has worked in #{@counter}"
  end
end

robot = Robot.new
robot.move
robot.print
def move
  @counter.to_i.succ
end
将打印您期望的内容:

万岁马尔可夫链在1

无显式初始值设定项的机器人编码 编码通常是风格的问题,如何编码不仅取决于你想做什么,还取决于你想传达什么。在这种情况下,您可以在不使用显式初始值设定项的情况下重写类,方法是在尝试递增@counter之前确保将其设置为零。例如:

class Robot
  def initialize
    @counter = 0
  end

  def move
    @counter += 1
  end

  def print
    puts "Hurray the Markov chain has worked in #{@counter}"
  end
end

robot = Robot.new
robot.move
robot.print
def move
  @counter.to_i.succ
end
这将确保如果@counter为nil,它将被转换为整数(在本例中为零),然后递增。这对一些人来说可能有点“神奇”,所以你也可能会看到人们对零防护的态度更加明确:

def move
  @counter ||= 0
  @counter  += 1
end

如果@counter为nil或false,则为其赋值为零。这确保了您能够根据其值调用数值方法。

Ruby中的实例变量不像您正在使用它们那样工作;您在
move
方法上方的行中创建一个类实例变量,然后在两个实例方法中使用一个实例变量。在这里,您将一个类实例变量
@counter
初始化为零,然后尝试用相同的名称递增一个未初始化的实例变量。这些变量彼此不同,就像
@night
@day
一样(但可以使用相同的名称共存)。由于实例变量在尝试递增时尚未初始化,因此其值为
nil
nil
NilClass
的一个实例,后者没有方法
+
(需要
+=
);因此提出了例外情况@jstim向您展示了初始化实例变量的常用方法;您在
move
方法上方的行中创建一个类实例变量,然后在两个实例方法中使用一个实例变量。在这里,您将一个类实例变量
@counter
初始化为零,然后尝试用相同的名称递增一个未初始化的实例变量。这些变量彼此不同,就像
@night
@day
一样(但可以使用相同的名称共存)。由于实例变量在尝试递增时尚未初始化,因此其值为
nil
nil
NilClass
的一个实例,后者没有方法
+
(需要
+=
);因此提出了例外情况@jstim向您展示了初始化实例变量的常用方法。不,类变量应该是
@@counter
。实际上,您可以使用@counter定义类变量,但该变量只能在类级别可见,而不能在实例级别可见level@tomsoft,您的术语与ruby无关。如果您想与其他ruby专家交谈,您必须学习ruby术语,在ruby中,类变量(@@x)和类实例变量(@x)之间存在差异(在cl中定义)