Ruby - вызов метода из цикла в другом методе - PullRequest
0 голосов
/ 21 декабря 2011

Вот проблема ...

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

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

Пока что это вызывает ошибку, утверждая, что тип не является float, который говорит мнечто цикл do each не преобразует значения.

Справка.

Спасибо !!!

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Звучит так, как будто вы ищете map:

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

или, поскольку convert_to_float - это метод того же класса, что и verify_amounts, вы можете использоватьObject#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] на стандартном выходе.

1 голос
/ 21 декабря 2011

При ближайшем рассмотрении две вещи идут не так, как надо.

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

    arrayoftotals.each do |convert_to_float|
    end
    

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

    arrayoftotals.each (&method (:convert_to_float)) 
    

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

  2. Вы не обновляете значения в массиве итогов. Так что даже если будет вызываться 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
...