- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我需要用 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)
返回显示new
在 Class
中定义(也可以用 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/
我正在尝试做这样的事情:Name[i] = "Name"+ (i+1) 在 forloop 中,这样数组的值将是:Name[0] = Name1,Name[1] = Name2,Name[2] = N
我读了here,在GSP中我们可以这样写: ${params.action} 从GSP中,我们可以使用${params.action}作为参数调用Javascript函数(请参阅here)。 是否有其
我的问题:非常具体。我正在尝试想出解析以下文本的最简单方法: ^^domain=domain_value^^version=version_value^^account_type=account_ty
我创建了一条与此类似的路线: Router::connect("/backend/:controller/:action/*"); 现在我想将符合此模式的每个 Controller 路由重命名为类似
我在 Visual Studio 2013 项目中收到以下警告: SQL71502 - Procedure has an unresolved reference to object 最佳答案 这可以
任何人都可以指导我使用名称/值 .NET 集合或 .NET 名称/值字典以获得最佳性能吗?请问最好的方法是什么?我的应用程序是 ASP.NET、WCF/WF Web 应用程序。每个集合应该有 10 到
我在 Zend Framework 2 中有一个默认模块: namespace Application\Controller; use Zend\Mvc\Controller\AbstractActi
这是表格: 关于javascript - 在 javascript 中,这是一个有效的结构吗? : document. 名称.名称.值?,我们在Stack Overflow上找到一个类似的
HtmlHelper.ActionLink(htmlhelper,string linktext,string action) 如何找出正确的路线? 如果我有这个=> HtmlHelper.Actio
我需要一些有关如何将 Controller 定义传递给嵌套在 outer 指令中的 inner 指令的帮助。请参阅http://plnkr.co/edit/Om2vKdvEty9euGXJ5qan一个
请提出一个数据结构来表示内存中的记录列表。每条记录由以下部分组成: 用户名 积分 排名(基于积分)- 可选字段- 可以存储在记录中或可以动态计算 数据结构应该支持高效实现以下操作: Insert(re
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我想要一个包含可变数量函数的函数,但我希望在实际使用它们之前不要对它们求值。我可以使用 () => type 语法,但我更愿意使用 => type 语法,因为它似乎是为延迟评估而定制的。 当我尝试这样
我正在编写一个 elisp 函数,它将给定键永久绑定(bind)到当前主要模式的键盘映射中的给定命令。例如, (define-key python-mode-map [C-f1] 'pytho
卡在R中的错误上。 Error in names(x) <- value : 'names' attribute must be the same length as the ve
我有字符串,其中包含名称,有时在字符串中包含用户名,后跟日期时间戳: GN1RLWFH0546-2020-04-10-18-09-52-563945.txt JOHN-DOE-2020-04-10-1
有人知道为什么我会收到此错误吗?这显示将我的项目升级到新版本的Unity3d之后。 Error CS0103: The name `Array' does not exist in the curre
由于 Embarcadero 的 NNTP 服务器从昨天开始就停止响应,我想我可以在这里问:我使用非数据库感知网格,我需要循环遍历数据集以提取列数、它们的名称、数量行数以及每行中每个字段的值。 我知道
在构建Android应用程序的子项目中,我试图根据根build.gradle中的变量设置版本代码/名称。 子项目build.gradle: apply plugin: 'com.android.app
示例用例: 我有一个带有属性“myProperty”的对象,具有 getter 和 setter(自 EcmaScript 5 起支持“Property Getters 和 Setters”:http
我是一名优秀的程序员,十分优秀!