【问题标题】:Sum of instance variables in Array RubyArray Ruby 中实例变量的总和
【发布时间】:2018-12-22 18:58:55
【问题描述】:

我有一个数组 item_list = [item1, item2, item3,] 存储有价格的对象。 我想计算这些价格的总和并将其显示为总计。

我尝试过这样做:

print "Items:"
item_list.each do |item|
  print " #{item.name},"
  prices_arr = []
  prices_arr << item.price
  sum = prices_arr.sum
end
  puts "Total: #{sum}"

但我得到错误,未定义的局部变量或方法“sum”。 如果我在循环中输入“Total: #{sum}”,它会给我每件商品的价格,但不是总数。 有什么想法吗?

【问题讨论】:

  • each 的每次迭代中,您都在创建一个全新的prices_arr。我怀疑这不是你的想法。

标签: arrays ruby loops instance-variables


【解决方案1】:

试试

sum = item_list.map(&:price).sum

【讨论】:

  • 只要使用.sum
  • 几乎,我认为,@SergioTulentsev 的意思是:sum = item_list.sum(&amp;:price) :)
  • @AlexGolubenko:是的。 2.4+,不过。
【解决方案2】:

您的方法的问题是变量 sum 是在循环内定义的,这就是它的范围被限制在循环内的原因

print "Items:"
item_list.each do |item|
  print " #{item.name},"
  prices_arr = []
  prices_arr << item.price
  sum = prices_arr.sum
end
puts "Total: #{sum}"

所以,更好的方法是:-

sum = 0
print "Items:"
item_list.each do |item|
  print " #{item.name},"
  sum += item.price
end
puts "Total: #{sum}"

【讨论】:

    【解决方案3】:

    这是使用诸如注入之类的东西的绝佳机会。从总和 0 开始,您可以执行以下操作。这允许您打印和使用数据项,还可以将其与任意累加器(在本例中为以 0 开头的整数)组合。

    print "Items:"
    sum = item_list.inject(0) do |sum, item|
      print " #{item.name},"
      sum += item.price
    end
    puts "Total: #{sum}"
    

    【讨论】:

      【解决方案4】:

      让我们首先创建一个示例数组item_list

      class List
        attr_reader :name, :price
        def initialize(name, price)
          @name, @price = name, price
        end
      end
      
      item_list = [List.new("tools", 148.16), List.new("food", 265.13),
                   List.new("hair", 84.51), List.new("books", 285.01)]
        #=> [#<List:0x000000019043a8 @name="tools", @price=148.16>,
        #    #<List:0x000000019042e0 @name="food", @price=265.13>,
        #    #<List:0x00000001904268 @name="hair", @price=84.51>,
        #    #<List:0x000000019041a0 @name="books", @price=285.01>]
      

      我们现在可以打印所需的值了。

      print "Items:"
      puts " Total: %.2f" % item_list.sum do |item|
        print " #{item.name},"
        item.price
      end
        # tools, food, hair, books, Total: 782.81
      

      【讨论】:

      • 另外List 可以使用def coerce(other); [self.price,other]; end 然后它可以sum 本身例如puts "#{item_list.map(&amp;:name).join(', ')} Total: %.2f" % item_list.sum
      • @engineersmnky,这很酷。我以前没有用过Numeric#coerce。一般来说,我认为coerce 方法可以对other 执行有效性测试,如果没有通过则引发异常。
      猜你喜欢
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2014-09-21
      • 2011-08-27
      • 2014-03-06
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      相关资源
      最近更新 更多