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中定义)