2013-08-13 3 views
0

Итак, я очень новичок в Ruby, и я пытаюсь узнать больше, преобразовывая скрипт python, над которым я работаю в Ruby. Однако я столкнулся с очень неприятной проблемой. Каждый раз, когда я пытаюсь запустить следующий код, я получаю эту ошибку:ArgumentError `initialize ': неправильное количество аргументов (8 для 0)

player.rb:81:in initialize': wrong number of arguments(8 for 0) (ArgumentError) from player.rb:81:in new' from player.rb:81:in `'

Я уверен, что есть 8 аргументов в методе инициализации, и я проверил орфографию во много раз. Я не могу понять, почему интерпретатор не считает, что конструктор не имеет никаких аргументов. Может ли кто-нибудь сообщить мне, что происходит неправильно ниже?

class Player 
    def determineLevel 
     @xp_req4lvl = [0, 1000, 2250, 3750, 5500, 7500, 10000, 13000, 16500, 20500, 26000, 32000, 39000,47000,57000,69000,83000,99000,119000,143000,175000,210000,255000,310000,375000,450000,550000,675000,825000,1000000] 
     if xp <= 1000 then 
      @level = 1 
      return 
     end 
     i=0 
     while i < xp_req4lvl.length do 
      if xp > xp_req4lvl[i] then 
       i+=1 
      elsif xp == xp_req4lvl[i] then 
       @level = i+1 
       return 
      else 
       @level = i 
       return 
     end 
     ml = xp_req4lvl.length 
     raise LevelingError.new(ml), "Level too high!", caller 
     return 
    end 

    def initialize(personalInfo, training, race, chclass, feats, stuff, abilities, xp) 
     @str, @con, @dex, @int, @wis, @cha = abilities 
     @trainedSkills = training 
     @characterClass = chclass 
     @feats = feats 
     @race = race 
     #for featx in self.race["racialFeats"]: 
     # self.feats.append(featx) 
     @equipment = stuff 
     @background = personalInfo 
     @xp =xp 
     @actionPoints = 1 
     @equippedArmor = nil 
     @equippedShield = nil 
     @armorProficiencies = [] 
     @shieldProficiencies = [] 
     @untrainedArmorEquipped = false 
     @untrainedShieldEquipped = false 
     @level = 0 
     self.determineLevel 
     rescue LevelingError => e 
      puts "Character is over maximum level of " + e.get_max_lvl.to_s 
      @level = 30 
     end 
     #self.calculateAbilityScores 
     #self.calculateAbilityMods 
     #self.calculateHP 
     #self.determineProficiencies 

     #@fortitudeSave = 10+(@level/2) 
     #@reflexSave = 10+(@level/2) 
     #@willSave = 10+(@level/2) 
     #puts @level.to_s 

     @healingSurgesUsed = 0 
    end 

    public 
    def get_level 
     return @level 
    end  
end 

class LevelingError < RuntimeError 
    attr :maxLvl 

    def initialize(ml) 
     @maxLvl = ml 
    end 

    def get_max_lvl() 
     return @maxLvl 
    end 
end 

if __FILE__ == $0 
    j = Player.new("0", "1", "2", "3", "4", "5", "[10,10,10,10,10,10]", "1250") 
    puts j.get_level.to_s 
end 

ответ

2

вы пропустили один end ключевое слово здесь:

while i < xp_req4lvl.length do 
      if xp > xp_req4lvl[i] then 
       i+=1 
      elsif xp == xp_req4lvl[i] then 
       @level = i+1 
       return 
      else 
       @level = i 
       return 
     end # !> mismatched indentations at 'end' with 'while' 

Если вы поставите более end один здесь, вы бы не получить error.But вы получите то another- syntax error, unexpected keyword_end, expecting end-of-input в связи с ниже:

def initialize(personalInfo, training, race, chclass, feats, stuff, abilities, xp) 
     @str, @con, @dex, @int, @wis, @cha = abilities 
     @trainedSkills = training 
     @characterClass = chclass 
     @feats = feats 
     @race = race 
     #for featx in self.race["racialFeats"]: 
     # self.feats.append(featx) 
     @equipment = stuff 
     @background = personalInfo 
     @xp =xp 
     @actionPoints = 1 
     @equippedArmor = nil 
     @equippedShield = nil 
     @armorProficiencies = [] 
     @shieldProficiencies = [] 
     @untrainedArmorEquipped = false 
     @untrainedShieldEquipped = false 
     @level = 0 
     self.determineLevel 
     rescue LevelingError => e 
      puts "Character is over maximum level of " + e.get_max_lvl.to_s 
      @level = 30 
     end # !> mismatched indentations at 'end' with 'def' 

Вы должны следовать, как показано ниже:

def method_name(..) 
    begin 
    # your code 
    rescue 
    # your codee 
    end 
end 

Но не используйте begin..rescue внутри метода #initialize.

+0

Попробуйте, что я сказал .. он пропустил конец 'while', поэтому метод' # initialize' перешел в цикл while. Если вы поместите один «конец», вы не получите ошибку аргумента. попробуйте сначала, затем дайте правильный ответ. –

+1

ОК, мой плохой, один для вас. На самом деле я не получил вашего ответа, теперь я это делаю. –

+0

@BeatRichartz спасибо за то, что подошел ... :) Я попробовал код, а затем ответил ... Но кредит принадлежит моему редактору, который четко обозначил точку ошибки, когда я нажал 'ctrl + X' .. :) –

Смежные вопросы