2015-11-13 4 views
0
@songs = [{artist: 'Artist', title: 'Title String', playback: '04:30'} etc] 

def convert_to_secs 
    a = str.split(':').map!{|x| x.to_i} 
    return (a[0] * 60) + a[1] 
end 

def longest_possible(playback) 
    @songs.select do |hsh| 
     x = hsh[:playback].convert_to_secs 
    end 
    return x 
end 

При попытке вызвать convert_to_seconds внутри longest_possible я получаю следующее сообщение об ошибке:Как вызвать определенный метод внутри другого определения

longest_possible.rb:5:in `block in longest_possible': private method 
`convert_to_secs' called for "04:30":String (NoMethodError) 
from longest_possible.rb:4:in `select' 
from longest_possible.rb:4:in `longest_possible' 
from longest_possible.rb:15:in `<main>' 

я не уверен, что моя проблема может быть решена с операторами области видимости, или это требует чего-то с классами (не то, что я коснулся еще.) Не могли бы вы указать мне в правильном направлении?

PS, игнорируйте функциональность второй функции, я еще не получил ее, только что опубликовал.

+0

Попробуйте изменить метод 'четкости convert_to_secs (а)' и вызова 'х = convert_to_secs (HSH [: воспроизведение])'. –

ответ

0

Основная проблема заключается в том, что вы вызываете метод с использованием строки в качестве приемника. Затем он пытается найти метод convert_to_secs среди методов, предопределенных для строк, и не находит его. Вместо этого вы должны передать hsh [: воспроизведение] в качестве аргумента. Так что ваш код должен выглядеть следующим образом:

def convert_to_secs(str) # Note the argument str introduced here 
    # You don't need map! here. Normal map suffices. 
    a = str.split(':').map {|x| x.to_i} 
    # In Ruby, you can leave away the return keyword at the end of methods. 
    (a[0] * 60) + a[1] 
end 

def longest_possible(playback) 
    @songs.select do |hsh| 
    x = convert_to_secs(hsh[:playback]) 
    end 
    return x 
end 
Смежные вопросы