ArgumentError:错误的参数数量(0表示1),即使使用提供的参数也是如此

时间:2014-05-02 18:04:09

标签: ruby-on-rails ruby-on-rails-4

我有一个"攻击"由于某种原因返回ArgumentError: wrong number of arguments (0 for 1)的方法,即使我提供了一个参数。调用是a.attack(b),其中a和b都是UnitInstance类的实例

这是我的班级,攻击方法也很好 - 任何建议都非常感谢!

编辑:此外,这是rails应用程序中的模型,但它不需要与数据库连接

class UnitInstance
    attr_accessor :name, :health, :current_health, :attack, :defence, 
    :initiative, :amount, :conditions

    def initialize(unit_id, amount)
        unit = Unit.find(unit_id)
        @name = unit.name
        @health = unit.health
        @current_health = unit.health
        @attack = unit.attack
        @defence = unit.defence
        @initiative = unit.initiative
        @amount = amount
        @conditions = []
    end

    def strength
        amount * attack
    end

    def dead?
        health <= 0 and amount <= 0
    end

    def find_target(enemies)

    end

    def decrease_health(_amount)
        hp = health * (self.amount - 1) + current_health
        hp -= _amount
        self.amount = hp / health + 1
        if hp % health == 0         
            self.amount -= 1
            self.current_health = 5
        else
            self.current_health = hp % health
        end
    end

    def attack(target)
        target.decrease_health(strength)
        decrease_health(target.defence) unless target.dead?     
        "#{name.titleize} attacked #{target.name.titleize} for #{attack} damage,"
    end

end

1 个答案:

答案 0 :(得分:2)

您有一个名为attack的方法,其中一个参数由a.attack(b)

调用
def attack(target)
  target.decrease_health(strength) ## <<-- Notice this
  decrease_health(target.defence) unless target.dead?     
  "#{name.titleize} attacked #{target.name.titleize} for #{attack} damage,"
end

您正在strengthattack

内调用strength方法
def strength
  amount * attack  ## << -- No arguments here
end

您在strength方法中收到错误,而您正在调用attack而没有任何参数。

@amount@attack实例变量,您已使用attr_accessor为其定义了getter和setter方法。 因此,对于@attack,您现在有两种方法attackattack=

请记住

  

Ruby类中可能只有一个具有给定名称的方法。如果好几个   在类中定义的具有相同名称的方法 - 最新的   覆盖以前的定义。

因此,当您使用参数定义attack(target)时,将覆盖访问方法attack。现在,您只剩下两种方法attack(target)attack=