【问题标题】:Ruby Programming Techniques: simple yet not so simple object manipulationRuby 编程技巧:简单但不那么简单的对象操作
【发布时间】:2010-04-13 10:35:39
【问题描述】:

我想创建一个对象,比如说一个 Pie。

class Pie 
  def initialize(name, flavor) 
    @name = name 
    @flavor = flavor 
  end 
end

但是一个馅饼可以分成 8 块、半块或整块馅饼。为了便于讨论,我想知道如何为每个 Pie 对象指定每 1/8、1/4 或每整体的价格。我可以这样做:

class Pie 
  def initialize(name, flavor, price_all, price_half, price_piece) 
    @name = name 
    @flavor = flavor 
    @price_all = price_all
    @price_half = price_half
    @price_piece = price_piece
  end 
end 

但是现在,如果我要创建 15 个 Pie 对象,我会使用诸如

之类的方法在某处随机取出一些块
getPieceOfPie(pie_name)

我如何能够生成所有可用的完整馅饼和剩余碎片的价值?最终使用的方法如:

   myCurrentInventoryHas(pie_name)
   # output: 2 whole strawberry pies and 7 pieces.

我知道,我是 Ruby nuby。感谢您的回答、cmets 和帮助!

【问题讨论】:

  • +1 表示该术语 - Ruby Nuby :)

标签: ruby math


【解决方案1】:

你能不能创建一个 PieSlice 对象,每个 Pie 都有一个 PieSlices 数组?

【讨论】:

    【解决方案2】:

    您肯定需要单独的 PiePiePiece

    class Pie
      attr_accessor :pieces
      def initialize
        self.pieces = []
      end
    
      def add_piece(flavor)
        raise "Pie cannot have more than 8 pieces!" if pieces.count == 8
        self.pieces << PiePiece.new(flavor)
      end
    
      # a ruby genius could probably write this better... chime in if you can help
      def inventory
        Hash[pieces.group_by(&:flavor).map{|f,p| [f, p.size]}]
      end
    
    end
    
    class PiePiece
      attr_accessor :flavor
      def initialize(flavor)
        self.flavor = flavor
      end
    end
    

    示例代码

    p = Pie.new
    p.add_piece(:strawberry)
    p.add_piece(:strawberry)
    p.add_piece(:apple)
    p.add_piece(:cherry)
    p.add_piece(:cherry)
    p.add_piece(:cherry)
    
    p.inventory.each_pair do |flavor, count|
      puts "Pieces of #{flavor}: #{count}"
    end
    
    # output
    # Pieces of strawberry: 2
    # Pieces of apple: 1
    # Pieces of cherry: 3
    

    【讨论】:

    • 甜,我喜欢这个答案。事实上,这是我正在努力解决的库存盘点问题。非常感谢您的帮助!
    • @Shyam,我更新了帖子以显示一种可能的方法来进行库存盘点。对 ArrayHash 方法有更好掌握的人可能会写得更好:)
    • 优秀。不需要天才,你已经做得很好了。谢谢!
    • @Shyam,@mckeed 帮忙了。我更新了Pie#inventory 方法来展示他的天才。
    【解决方案3】:

    Pie 类可以有一个计数器来指示它的剩余部分。 getPieceOfPie 方法将修改此计数器。 myCurrentInventoryHas 方法然后可以查看每个 Pie 并查看该 Pie 中有多少正在检查计数器。

    【讨论】:

      【解决方案4】:

      一块馅饼不是馅饼。

      (用 oo 术语来说,一个对象应该有明确的职责,将对象做成饼和切片可能不是明确的职责分配)。

      【讨论】:

      • 我同意你的看法。而提出这个问题的原因之一是想用OO和优雅来找出解决方案。
      • 我认为,如果您有一个带有切片数组的 Pie,则不会“违反”OO 原则。
      • 这一切都取决于你想用你的馅饼和碎片做什么。如果你可以假设每个部分都是独立的(你不需要知道一个馅饼是否被切开)你可能只需要一个 PieInventory 和一个 PiePiece。当您调用 push_pieces(n) 和 pull_pieces(n) 时,库存可以增加和减少。
      • 但是如果我想知道什么时候切馅饼怎么办?这是问题的全部想法!我知道,这是一个尴尬的问题,但这就是它困扰我的原因:)
      • 我只是假设你有 n/8 个馅饼和 n%8 个切块。为什么一次切不止一个馅饼?
      猜你喜欢
      • 1970-01-01
      • 2012-02-03
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      相关资源
      最近更新 更多