随机分配实例变量?

时间:2014-04-17 01:09:48

标签: ruby initialization instance-variables

我不确定是否可以这样做,但我想我会问。

我目前有这个:

class Color

attr_accessor :is_blue, :is_green, :is_brown, :is_yellow, :is_orange

def initialize
  @is_blue = false
  @is_green = false
  @is_brown = false
  @is_yellow = false
  @is_orange = false
end

def random_starting_color
  starting_color = [is_blue, is_green, is_brown, is_yellow, :is_orange].sample
  starting_color = true
end
end

正如您猜测的那样,random_starting_color无法正常工作。有没有人知道在创建新的Color对象时如何重新分配新颜色?

2 个答案:

答案 0 :(得分:4)

我认为你的意思是这样的:

ivars = [:@is_blue, :@is_green, :@is_brown, :@is_yellow, :@is_orange]
instance_variable_set(ivars.sample, true)

答案 1 :(得分:3)

您不应将颜色存储在不同的变量中,而应仅存储在一个变量中。否则你需要处理如果红色,棕色和蓝色为真的情况会发生什么。只有你有一个真正的RGB模型,但你需要可数值而不是布尔值。

class Color
  COLORS = [:blue, :green, :brown, :yellow, :orange]

  attr_reader :color

  def initialize(color = :random)
    @color = color
  end

  def color=(color)
    if color == :random
      @color = COLORS.sample
    else
      @color = color if COLORS.include?(color)
    end
  end

  COLORS.each do |color|
    def #{color}?
      @color == :#{color}
    end
  end
end

c = Color.new     
c.color           # => a random color out all possible COLORS
c.color = :blue
c.color           # => :blue
c.blue?           # => true
c.yellow?         # => false

c.color = :random
c.color           # => a random color out all possible COLORS