1

正しい方法で質問していない場合は、事前に申し訳ありません。

このちょっとした Ruby コードを機能させようとしています。私が理解していないのは、クリックが収率オプションを循環するように、一番下の収率関数(信号機)を呼び出す方法です。true、false、false は、上部がオンで、下部の 2 つが false であるため、ライトが赤であることを意味します。また、列挙子と利回りに頭を悩ませています。

class TrafficLight  
  include Enumerable
  include TL

  def each
    yield [true, false, false]
    yield [true, true, false]
    yield [false, false, true] 
    yield [false, true, false] 
  end
end

class Bulb < Shoes::Shape
  attr_accessor :stack
  attr_accessor :left
  attr_accessor :top
  attr_accessor :switched_on

  def initialize(stack, left, top, switched_on = false)    
    self.stack = stack #don't change. 
    self.left = left    
    self.top = top
    self.switched_on = switched_on
    draw left, top, bulb_colour

  end

  # HINT: Shouldn't need to change this method
  def draw(left, top, colour
    )    
    stack.app do
      fill colour

      stack.append do
        oval left, top, 50
      end
    end
  end

  def bulb_colour 
    "#999999"
  end  
end

class GoBulb < Bulb
  def bulb_colour
    "#00FF30"
  end
end

class WaitBulb < Bulb
  def bulb_colour
    "#FFFC00"
  end
end

class StopBulb < Bulb
  def bulb_colour
    "#FF0000"
  end
end

module TL 
  Go = "#00FF30"
  Wait = "#FFFC00"
  Stop = "#FF0000"
end

Shoes.app :title => "My Amazing Traffic Light", :width => 150, :height => 250 do
  background "000", :curve => 10, :margin => 25  
  stroke black    

  @traffic_light = TrafficLight.new
  @top = StopBulb.new self, 50, 40, true     
  @middle = Bulb.new self, 50, 100, true
  @bottom = Bulb.new self, 50, 160, true


  click do #make this switch on/off depending on what you click. Only 1 should be on 

  end
end

私はグーグルで検索しましたが、取得した列挙子の例では、必要なことを実行できませんでした。どんな洞察も大歓迎です。

4

1 に答える 1

2

現在のバージョンの Shoes に同梱されている Ruby (1.9.1) は、 で予期しない動作をしEnumerator#nextます。このメソッドが呼び出されるとスタックします。したがって、から値を繰り返し取得することはできませんEnumerator

TrafficLightを模倣するには、クラスを書き直す必要がありますEnumerator#next。にそのようなバグがない場合は、この循環列挙子で `nextnextを使用TraficLight.new.cycleして繰り返し呼び出すことができます。

module TL 
  Go = "#00FF30"
  Wait = "#FFFC00"
  Stop = "#FF0000"
end

class TrafficLight
  include TL
  STATUS = [
    [true, false, false], 
    [true, true, false], 
    [false, false, true],
    [false, true, false]
  ]
  def initialize; @index = 0; end
  def current
    STATUS[@index % STATUS.size]
  end
  def next
    @index += 1
    current
  end
end

Update 、電球を再描画Bulbするメソッドを追加します。update(on)

def update(on = false)
  self.switched_on = on
  draw self.left, self.top, on ? self.bulb_colour : '#999999'
end

Shoes.appそして、特定の電球を使用するようにメイン ロジックを更新します。

@traffic_light = TrafficLight.new
@top = StopBulb.new self, 50, 40, true     
@middle = WaitBulb.new self, 50, 100, false
@bottom = GoBulb.new self, 50, 160, false

click do #make this switch on/off depending on what you click. Only 1 should be on 
  status = @traffic_light.next
  [@top, @middle, @bottom].zip(status).each do |light, on|
    light.update(on)
  end
end
于 2013-03-28T12:54:13.747 に答える