2015-07-15 2 views
0

Как способ изучить все аспекты рубинов, я решил сделать (относительно простую) текстовую RPG. Все до сих пор прошло хорошо, за исключением того, что недавно я попал в блокпост, который я раньше не видел.Ruby: Undefined Method `<'

Моя цель: если стат (улица, Защита, аги, человек) является < 0, я хочу сделать это = 0. По какой-то причине, хотя, рубин, кажется, не нравится `<».

Вот код рубин висит на:

def self.compile 
@str = ProfileData.load['g_str'] 
@def = ProfileData.load['g_def'] 
@agi = ProfileData.load['g_agi'] 
@man = ProfileData.load['g_man'] 
@smin = 1 
@dmin = 1 
@amin = 1 
@mmin = 1 
if @str < @smin 
    @str = 0 
end 
if @def < @dmin 
    @def = 0 
end 
if @agi < @amin 
    @agi = 0 
end 
if @man < @mmin 
    @man = 0 
end 
@str.round! 
@def.round! 
@agi.round! 
@man.round! 
d = YAML::load_file('./profile') 
d['mstr'] = @str 
File.open('./profile', 'w') {|f| f.write d.to_yaml} 
d = YAML::load_file('./profile') 
d['mdef'] = @def 
File.open('./profile', 'w') {|f| f.write d.to_yaml} 
d = YAML::load_file('./profile') 
d['magi'] = @agi 
File.open('./profile', 'w') {|f| f.write d.to_yaml} 
d = YAML::load_file('./profile') 
d['mman'] = @man 
File.open('./profile', 'w') {|f| f.write d.to_yaml} 

конца

Теперь, когда я бегу через мою программу, я получаю этот код ошибки, когда он, наконец, работает «компилировать»:

start.rb:734:in `compile': undefined method `<' for []:Array (NoMethodError) 

И все. Есть ли какие-либо сведения о том, что произошло или как я могу это исправить? Любая помощь очень ценится!

+0

Похоже, ваш код загрузки '@str = ProfileData.load [«g_str»]' возвращает массив, а не отдельное значение, поэтому он не может быть использован в '<' сравнения. – mikej

+0

Где вы писали 'if @def <@ dmin', вы имели в виду' if @ ddef ...'? Потому что вы назвали переменную '@ ddef'. –

+0

@SebastianMotraghi - спасибо, что поймал это. Это было случайно оставлено после попытки решить проблему ранее. Я забыл удалить дополнительный d. –

ответ

1

Это означает, что ваши переменные (по сравнению с одной по сравнению с парой) составляют Array.

Проверьте, что каждый из этих

@str = ProfileData.load['g_str'] 
@ddef = ProfileData.load['g_def'] 
@agi = ProfileData.load['g_agi'] 
@man = ProfileData.load['g_man'] 

возвращается и убедитесь, что это Comparable (целые числа, например).

+0

Это хорошо, по крайней мере, понять, что означает ошибка - спасибо! В начальном меню я добавил быстрый вариант, чтобы вытащить значения вышеперечисленного - все они загружаются и все числа. –

+0

@ChristopherHarlan вы можете использовать 'is_a? (Comparable)' для проверки общего типа каждого из вышеупомянутых –

+0

Эй, Андрей - спасибо за ответ. К сожалению, я понятия не имею, как делать то, что вы предлагаете. Где я должен поставить «.is_a?()» После, и что я должен искать? –

1

Метод загрузки, по-видимому, предполагает, что это будет набор переменных, даже если у вас есть только один.

Если вы даете всегда быть одним, выберите только первое, и, поскольку это может быть строка, вы должны сделать это int.

@str = ProfileData.load['g_str'].first.to_i 
+0

Я попробовал ваше предложение (добавление .first.to_i), и оно работает в определенной степени - в первый раз. По какой-то причине он принимает все значения (например, ['str'] установлен в 14) и устанавливает их в ноль - неуверенный способ. Затем в следующий раз, когда я обновляю статистику, я получаю: «start.rb: 725: in' compile »: undefined method' first 'for 15: Fixnum (NoMethodError)' –

+0

В первый раз вы получили что-то вроде пустую строку. Затем, во второй раз у вас уже есть номер. Вы проверили файл после и до сохранения? Что-то изменилось? –

+0

Ничего не изменилось - единственное изменение детали - это значение «g_str», поскольку оно основано на случайном числе. Посмотрев файл, который содержит «g_str» (через YAML, в том же каталоге), номер уже существует. Число всегда было, но описанный выше метод не может найти его и/или сказать, что это число. –