随机选择ruby中的属性值

时间:2014-11-16 19:28:12

标签: ruby algorithm oop random binary-tree

这是我在我的二叉树中创建节点的Node类。

# This class creates node.
class Node
 attr_accessor :value,:left,:right,:random
 def initialize(value,left,right)
  @value = value
  @left = left
  @right = right 
  @random = ["left","right"].sample
  puts "\nNode with value #{@value} is created".green
 end
end

下面的代码是我的二叉树创建代码

的一行
current.left = Node.new(val,nil,nil)

但是,我想要随机选择current.leftcurrent.right,而不是使用leftright。因此,我尝试创建随机属性@random = ["left","right"].sample并将其用作current.random = Node.new(val,nil,nil)。但这显然不起作用。任何人都可以指导我如何处理这个问题。

2 个答案:

答案 0 :(得分:1)

您可以使用send

动态设置类属性
prop_name = ["left","right"].sample
prop_value = Node.new(val,nil,nil)
current.send("#{prop_name}=",prop_value)

或更简单

current.send("#{['left','right'].sample}=", Node.new(val,nil,nil))

答案 1 :(得分:0)

通过此实现,将存储随机数(0或1),分别代表leftright。您也可以调用reset_random_method重新滚动随机方法指向的位置。

class Node
  attr_accessor :value, :left, :right
  def initialize(value, left = nil, right = nil)
    self.value = value
    self.left = left
    self.right = right
    reset_random_method
  end

  def reset_random_method
    self.random_number = rand 2
  end

  def random
    send([:left, :right][random_number])
  end

  def random=(value)
    send([:left=, :right=][random_number], value)
  end

  private

  attr_accessor :random_number
end