【问题标题】:Randomly selecting attribute value in ruby在ruby中随机选择属性值
【发布时间】:2014-11-16 19:28:12
【问题描述】:

这是我的 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) 一样使用它。但这显然不起作用。谁能指导我如何解决这个问题。

【问题讨论】:

  • 我使用gem colorize 在控制台中为文本着色。

标签: ruby algorithm oop random binary-tree


【解决方案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))

【讨论】:

  • 漂亮.. 谢谢。
  • 我不能这样吗? current.send("#{['left','right'].sample}") = Node.new(val,nil,nil)
  • 没有。您正在对当前对象调用一个方法,而您传入​​的参数允许您动态设置属性。您不是通过直接调用 setter 来设置属性,而是传递函数名(在本例中为 setter)、参数(在本例中为您要将属性设置为的对象),然后允许 send 完成工作给你。
【解决方案2】:

通过此实现,将存储一个随机数(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

【讨论】:

  • 我想这是我第一次看到私有访问器。没什么问题,就是有点不正常。
  • 当我希望访问器保持定义的状态(在本例中为 0 或 1 值)时,我通常将访问器设为私有。通过这种方式,用户可以以安全的方式(通过reset_random_method)与random_number 进行交互,而不会无意中或出于恶意目的破坏状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2011-02-01
  • 2019-07-30
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多