【问题标题】:Ruby - Calling a method from a loop within another methodRuby - 从另一个方法中的循环调用方法
【发布时间】:2012-01-24 22:22:47
【问题描述】:

问题来了……

我有一个方法,我正在调用它来去除字符并将字符串转换为浮点数。

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

到目前为止,它提出了错误,指出类型不是浮点数,这告诉我 do each 循环没有转换值。

帮助。

谢谢!!!

【问题讨论】:

    标签: ruby methods each iteration


    【解决方案1】:

    听起来你在寻找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]

    【讨论】:

      【解决方案2】:

      经过仔细检查,这里有两个问题。

      1. 您将方法作为迭代函数传递的语法是错误的。

        arrayoftotals.each do |convert_to_float|
        end
        

        结果是一个空块,其中局部变量称为 convert_to_float。您正在寻找的语法是:

        arrayoftotals.each (&method (:convert_to_float)) 
        

        这会传递一个引用方法 convert_to_float 作为块的 Proc 对象。

      2. 您没有更新 arrayoftotals 中的值。因此,即使调用了 convert_to_float,它也不会做任何事情。

        要么将 gsub 更改为 gsub!破坏性地清理您的字符串,或使用地图!而不是 each 将数组中的每个元素替换为对其调用函数的结果。地图!是一个更好的选择,因为这意味着您不必调整 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
      

      【讨论】:

      • 我唯一需要改变的是:arrayoftotals = [total,subtotal,tax].map!(&method(:convert_to_float) 之后就完美了。感谢EmFi。
      • 如果你这样做了,那么你就不需要地图了!地图会做得很好。
      • 说到底,虽然这个解决方案有效,但我走了另一条路。 arrayoftotals = [] [总计,小计,税].each {|a| arrayoftotals
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      相关资源
      最近更新 更多