Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby中属性值的随机选择_Ruby_Algorithm_Oop_Random_Binary Tree - Fatal编程技术网

ruby中属性值的随机选择

ruby中属性值的随机选择,ruby,algorithm,oop,random,binary-tree,Ruby,Algorithm,Oop,Random,Binary Tree,这是我的节点类,用于在二叉树中创建节点 # 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 #{@

这是我的节点类,用于在二叉树中创建节点

# 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.left
current.right
,而是想随机选择
left
right
。因此,我尝试创建随机属性
@random=[“left”,“right”].sample
并像
current.random=Node.new(val,nil,nil)
一样使用它。但这显然不起作用。有谁能指导我如何处理这个问题。

您可以使用

或者更简单地说

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

在这个实现中,将存储一个随机数(0或1),分别表示
。您还可以调用
reset\u random\u 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

美丽的。。谢谢。我不能这样做吗
current.send(“#{['left','right'].sample}”)=Node.new(val,nil,nil)
No。您正在对当前对象调用一个方法,您传入的参数允许您动态设置属性。您不是通过直接调用setter来设置属性,而是通过传递函数名(在本例中为setter)、参数(在本例中为要设置属性的参数)来设置属性然后允许
send
为您做这项工作。我正在使用
gem colorize
为控制台中的文本上色,就是这样。我想这是我第一次看到私人访问者。这没什么问题,只是有点不寻常。当我希望访问器保持已定义的状态(在本例中为0或1值)时,我通常将访问器设置为私有。这样,用户可以安全地(通过
重置随机数方法
)与
随机数
交互,并且不会无意中或出于恶意目的破坏状态。
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