Ruby Programming Techniques: простое, но не очень простое манипулирование объектами - PullRequest
5 голосов
/ 13 апреля 2010

Я хочу создать объект, скажем, пирог.

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 

Но теперь, если бы я создал пятнадцать объектов Pie, и я бы где-то случайно выбрал несколько кусков, используя метод, такой как

getPieceOfPie(pie_name)

Как бы я мог сгенерировать значение всех доступных пирогов, которые являются целыми, и оставшиеся кусочки? В конце концов, используя метод, такой как:

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

Я знаю, я Руби Нуби. Спасибо за ваши ответы, комментарии и помощь!

Ответы [ 4 ]

3 голосов
/ 13 апреля 2010

Не могли бы вы создать объект PieSlice, и каждый пирог будет иметь массив PieSlices?

2 голосов
/ 13 апреля 2010

Вам определенно понадобятся отдельные Pie и PiePiece классы

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
1 голос
/ 13 апреля 2010

Класс Pie может иметь счетчик, указывающий, какая его часть остается. Метод getPieceOfPie изменил бы этот счетчик. Затем метод myCurrentInventoryHas может посмотреть на каждый пирог и посмотреть, сколько из этого пирога будет проверять счетчик.

0 голосов
/ 13 апреля 2010

Кусок пирога - это не пирог.

(говоря словами, объект должен иметь четкую ответственность, превращая объект в пирог, а срез не может быть четким назначением ответственности).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...