gpt4 book ai didi

ruby - 如何在 Ruby 中生成随机名称

转载 作者:数据小太阳 更新时间:2023-10-29 07:26:57 26 4
gpt4 key购买 nike

我需要用 ruby​​ 编写一个程序来生成像 KU765 或 NG274 样式的机器人名称并存储它们并检查它以避免重复。我还需要制作一个“重置”方法来删除所有存储的名称并重新开始。该程序由于某种原因不工作。我希望有人能帮助我找到错误。非常感谢。

class Robot
attr_accessor :named , :stored_names , :rl
def self.name
new.name
end

@@rl = "_ABCDEFGHIJKLMNOPQRSTUVWXYZ"

def name
named = ""
named << @@rl[rand(26).to_i]
named << @@rl[rand(26).to_i]
named << rand(100..999).to_s
named.save_name
named.check_name
end

def save_name
stored_names = []
stored_names << named
end

def check_name
stored_names.uniq!
end

def reset
stored_names = Array.new
end
end

最佳答案

这是构造 Robot 的另一种方法您可能希望考虑的类(class)。 (我的回答通常不会这么长或这么详细,但我写这篇文章的部分原因是为了在我自己的脑海中澄清 Ruby 对象模型的各个方面。我希望它能帮助其他人做同样的事情。)

代码

PREFACE      = ('A'..'Z').to_a << ?_
SUFFIX = ('0'..'9').to_a
PREFACE_SIZE = 2
SUFFIX_SIZE = 3

class Robot
def self.reset() @bots = [] end
reset
def self.new() (@bots << super).last end
def self.bots() @bots end
def self.delete(bot) @bots.delete(bot) end
def self.bot_names() @bots.map { |b| b.name } end

attr_reader :name

def initialize() @name = add_name end

private

def add_name
loop do
@name = gen_name
return @name unless self.class.bot_names.include?(@name)
end
end

def gen_name
PREFACE.sample(PREFACE_SIZE).join << SUFFIX.sample(SUFFIX_SIZE).join
end
end

示例

Robot.bots           #=> []
robbie = Robot.new #=> #<Robot:0x000001019f4988 @name="AP436">
robbie.name #=> "AP436"
Robot.bots #=> [#<Robot:0x000001019f4988 @name="AP436">]
r2d2 = Robot.new #=> #<Robot:0x000001019cd450 @name="KL628">
r2d2.name #=> "KL628"
Robot.bots #=> [#<Robot:0x000001019f4988 @name="AP436">,
# #<Robot:0x000001019cd450 @name="KL628">]
Robot.bot_names #=> ["AP436", "KL628"]
Robot.delete(robbie) #=> #<Robot:0x000001019f4988 @name="AP436">
Robot.bots #=> [#<Robot:0x000001019cd450 @name="KL628">]
Robot.bot_names #=> ["KL628"]
Robot.reset #=> []
c3po = Robot.new #=> #<Robot:0x000001018ff8c0 @name="VO975">
Robot.bots #=> [#<Robot:0x000001018ff8c0 @name="VO975">]

解释

  • 解析类时,类方法reset首先创建,然后是 reset 行被执行。作为self => Robot发生这种情况时,类方法 reset被执行,初始化@bots到一个空数组。

  • 负责保存和修改 Robot 的实例列表与类(class)有关。此列表保存在类实例变量 @bots 中.

  • Robot 的实例通过调用 Robot::new 创建,它分配内存然后调用(私有(private))实例方法 initialize . new在哪里?由于我们在Robot中没有将其定义为类方法,有两种可能:继承自Robot之一的祖先 ( Robot.ancestors => [Robot, Object, Kernel, BasicObject] ) 或者它是类 Class 的实例方法,因为这是 Robot 的类别是一个实例(即 Robot.class => Class )让我们找出哪个: Class.instance_method(:new) => #<UnboundMethod: Class#new> (或 Class.instance_methods.include?(:new) => true ),Object.method(:new) => #<Method: Class#new> .两者都是!但这是有道理的,因为所有类都是 Class 的实例。 , 包括 Robot的父类(super class),Object . #<Method: Class#new>Object.method(:new) 返回显示newClass 中定义(也可以用 Robot.method(:new).owner => Class 来查看。很酷,是吗?如果您还不知道这一点,并且可以按照我在本段中所说的进行操作,那么您就已经了解了 Ruby 对象模型的精髓!

  • 假设我们添加类方法new ,如下所示,至 Robot . super调用类方法 Object::new (这是实例方法 Class#new ),传递 new 的任何参数(这里没有)。 Object::new返回它创建的实例,Robot::new依次返回。因此,该方法只是一个管道,对结果没有影响。

    def self.new
    super
    end
  • 我们可以对上面的方法做一个小改动,添加一个由 Object::new 创建的实例的副本。到数组 @bots :

    def self.new
    instance = super
    @bots << instance
    instance
    end
  • 我把它写得更简洁一点:

    def self.new
    (@bots << super).last
    end
  • 我使用了方法 Array#sample随机抽取PREFACE_SIZE来自 PREFACE 的字符和 SUFFIX_SIZE来自 SUFFIX_SIZE 的字符. sample样本没有替换,所以你不会得到,例如,“UU112”。如果你想用替换采样,替换方法gen_name具有以下内容:

    def gen_name
    str = PREFACE_SIZE.times.with_object('') { |_,s| s << PREFACE.sample }
    SUFFIX_SIZE.times { str << SUFFIX.sample }
    str
    end
  • 我创建了一个类方法 bots返回类实例变量的值 @bots .这也可以通过为 @bots 定义一个读取访问器来完成。在 Robots '单例类:

    class << self
    attr_reader :name
    end
  • Robot.reset被调用时,Robot 的所有实例会发生什么?它包含?他们会被遗弃在森林里游荡,被拒绝和无家可归吗?使用类似 C 的语言在将它们放在一边之前,您需要释放它们的内存。在 Ruby 和许多其他现代语言中,这不是必需的(而且通常无法做到)。 Ruby 的“垃圾收集”跟踪所有对象,并杀死(在释放内存后)任何不再被任何其他对象引用的对象。不错,嗯?

关于ruby - 如何在 Ruby 中生成随机名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26828107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com