2011-12-21 4 views
0

Вот проблема ...Рубин - Вызов метода из цикла в другом методе

У меня есть метод, который я звоню, чтобы вырезать символы и преобразовать строки в поплавки.

def convert_to_float(currency) 
    return currency.gsub(/regex/, "").to_f 
end 

У меня есть другой метод, который принимает строковые значения. То, что я хочу сделать, это перебрать полученные строки с помощью метода convert_to_float вместо применения gsub к каждой строке. Вот что у меня есть ... это возможно даже с тем, как я это делаю?

def verify_amounts(total,subtotal,tax) 
    arrayoftotals = [total,subtotal,tax] 
    arrayoftotals.each do |convert_to_float| 
    end 

    ftotal = arrayoftotals[0] 
    raise "ftotal must be a Float" unless ftotal.kind_of? Float 
end 

До сих пор его повышение вины о том, что тип не является поплавок, который говорит мне, что делать каждый цикл не преобразовывать значения.

Помощь.

Спасибо !!!

ответ

1

При ближайшем рассмотрении здесь есть две вещи.

  1. Ваш синтаксис для передачи метода в качестве итеративной функции является неправильным.

    arrayoftotals.each do |convert_to_float| 
    end 
    

    Выполняется как пустой блок, где локальная переменная называется convert_to_float. Синтаксис вы ищете это:

    arrayoftotals.each (&method (:convert_to_float)) 
    

    Это передает объект Proc со ссылкой на метод convert_to_float как ваш блок.

  2. Вы не обновляете значения внутри arrayofotals. Так что даже если бы был вызван convert_to_float, это ничего не сделало.

    Либо изменить gsub на gsub! деструктивно дезинфицировать ваши строки на месте или использовать карту! вместо каждого заменить каждый элемент массива на результат вызова функции на нем. карта! это лучший выбор, потому что это означает, что вам не придется настраивать каждое другое использование convert_to_float.

Собираем все вместе:

def convert_to_float(currency) 
    return currency.gsub(/regex/, "").to_f 
end 

def verify_amounts(total,subtotal,tax) 
    arrayoftotals = [total,subtotal,tax] 
    arrayoftotals.map! (&method (:convert_to_float) 

    ftotal = arrayoftotals[0] 
    raise "ftotal must be a Float" unless ftotal.kind_of? Float 

end 
+0

Единственное, что я должен был изменить: arrayoftotals = [итого, итого, налог] .map!(& method (: convert_to_float) После этого это было прекрасно. Спасибо EmFi. – r3nrut

+0

Если это то, что вы сделали, тогда вам не понадобилась карта !. карта бы сделала хорошо. – EmFi

+0

После того, как все сказано и сделано, хотя это решение сработало Я пошел другим путем. arrayoftotals = [] [итого, промежуточный, налог] .each {| a | arrayoftotals << convert_to_float (a)} – r3nrut

2

Похоже, вы ищете map:

arrayoftotals = [total, subtotal, tax].map { |x| convert_to_float(x) } 

или, поскольку convert_to_float является метод в том же классе, как verify_amounts , вы можете использовать Object#method method, чтобы написать его вот так:

arrayoftotals = [total, subtotal, tax].map(&method(:convert_to_float)) 

Например, это:

class Pancakes 
    def convert_to_float(currency) 
     currency.gsub(/[^\d.]/, '').to_f 
    end 

    def verify_amounts(total, subtotal, tax) 
     arrayoftotals = [total, subtotal, tax].map(&method(:convert_to_float)) 
     puts arrayoftotals.inspect 
    end 
end 

Pancakes.new.verify_amounts('where1.0', '2.is0', '3.0house') 

даст вам [1.0, 2.0, 3.0] на стандартный вывод.

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