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