Ruby:作用域和类/实例方法有问题

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

我在理解ruby中的作用域时遇到了一些问题

如果您想下载/运行我所说的内容,自己看看,这里有一个到回购协议的链接:

我有几个.rb文件,具体来说,我在从实例调用类方法时遇到了一个问题。似乎我没有正确地遵循范围,但我不确定如何或为什么

以下是room.rb中的一个片段:

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