Ruby:作用域和类/实例方法有问题
我在理解ruby中的作用域时遇到了一些问题 如果您想下载/运行我所说的内容,自己看看,这里有一个到回购协议的链接: 我有几个.rb文件,具体来说,我在从实例调用类方法时遇到了一个问题。似乎我没有正确地遵循范围,但我不确定如何或为什么 以下是room.rb中的一个片段:Ruby:作用域和类/实例方法有问题,ruby,scope,instance-variables,class-variables,Ruby,Scope,Instance Variables,Class Variables,我在理解ruby中的作用域时遇到了一些问题 如果您想下载/运行我所说的内容,自己看看,这里有一个到回购协议的链接: 我有几个.rb文件,具体来说,我在从实例调用类方法时遇到了一个问题。似乎我没有正确地遵循范围,但我不确定如何或为什么 以下是room.rb中的一个片段: module KillShit class Room attr_reader :player, :monster, :game def initialize(player, monste
module KillShit
class Room
attr_reader :player, :monster, :game
def initialize(player, monster, game)
@player = player
@monster = monster
@game = game
end
def action
outline
Player.describe(player)
vs
Monster.describe(monster)
outline
#rolling a d20 to see who takes a turn
turn = rand(1..100)
if turn <= 20
monster_attack
else
puts "What would you like to do?"
puts "1. Attack!"
puts "2. Defend!"
puts "3. Run away!"
#Give the player magic if they're at least level 2
if player.maglevel >= 1
puts "4. Cast spell"
else
end
prompt; action = gets.chomp
if action == "1"
attack(player, monster)
elsif action == "2"
defend
elsif action == "3"
flee
elsif action == "4" && player.maglevel >= 1
magic
else
action
end
end
end
def magic
puts "What magic would you like to cast?"
if player.maglevel == 1
puts "1. Heal"
puts "2. Fireball"
puts "3. Tremor"
prompt; magic = gets.chomp
if magic == "1"
Spells.heal(player)
elsif magic == "2"
Spells.fireball(player, monster)
elsif magic == "3"
Spells.tremor(player, monster)
else
magic
end
elsif player.maglevel == 2
puts "1. Greater Heal"
puts "2. Firestorm"
puts "3. Earthquake"
prompt; magic = gets.chomp
if magic == "1"
Spells.greaterheal(player)
elsif magic == "2"
Spells.firestorm(player, monster)
elsif magic == "3"
Spells.earthquake(player, monster)
else
magic
end
else
end
end
end
end
我认为这可能是因为我需要将“action”定义为一个带有“self”的类方法,但这并没有做到。我还认为这是因为我试图从类本身调用“action”,而不是我正在使用的类的实例,因此我应该调用.action,但我不知道如何做
有什么想法吗?我应该读些什么来更好地理解这里发生的事情背后的概念?
谢谢 看了一眼之后,您并没有定义类,而是定义了实例方法
action
类方法需要通过关键字self
或类名直接引用,因此需要通过以下方式修复定义:
module KillShit
class Room
…
def self.action
…
end
…
end
end
最新答复:
module KillShit
class Room
def self.action
puts 'action in Room !'
end
end
class Spells
def self.heal(player)
Room.action
end
end
end
KillShit::Spells.heal('Wallace')
# action in Room !
您应该调用方法室#操作,如:
KillShit::Room.action
使用pry gem来帮助调试此操作。使程序在错误行之前和之后停止。是的-这也是我的想法,但我在重命名为self.action时得到相同的结果。我是否需要以不同于“Room.action”的方式调用它?那么您不应该得到错误,不需要不同的调用方式。看起来你搞糟了一些不同的事情。你确定用
require\u relative'room'
加载的模块是固定的吗?我使用了你的示例,你可以看到它确实有效。我检查了文件room.rb,其中你声明了一个类方法action,在class room的实例方法中,你调用了一个名为“action”的方法/变量。我想这会造成一些混乱。如果您是从类的实例方法调用操作,那么应该是该类的实例方法。
module KillShit
class Room
def self.action
puts 'action in Room !'
end
end
class Spells
def self.heal(player)
Room.action
end
end
end
KillShit::Spells.heal('Wallace')
# action in Room !
KillShit::Room.action