我想建立一个简单的链接清单类型,列出在废墟中物体的类型;如果类别中的事例变数与另一种类型相同。
只是一个快速的注解: 类型<>m>是鲁比的一个非常危险的词,特别是如果你来自 Java。 由于历史性事故,该词既用于动态打字,也用于静态打字,仅指两件表面上相关的,但又非常不同。
在动态打字中,一类是贴在 > > 值上的标签(not a reference)。
此外,在鲁比,类型的概念比 Java大得多。 在Java方案管理员的脑中,“类型”是指与“阶级”相同的东西(尽管这并不真实,因为Interface和primitives也是类型)。 在鲁比,“类型”是指“我可以做什么”。
例如:在 Java,当我说什么是String时,我就是指String
类别的一个直接例子。 在鲁比,当我说什么是“String时,我指的是要么是这样。
- a direct instance of the
String
class or
- an instance of a subclass of the
String
class or
- an object which responds to the
#to_str
method or
- an object which behaves indistinguishably from a String.
我想活下来,把所有节点连接起来;在施工者被召唤之前,只有一次。 有些人说,我们通常在Java Static街区这样做。
在鲁比拉,一切都是可以执行的。 尤其是,不存在“级声明”这样的内容:一类机构就像任何其他机构一样,只是可辩驳的法典。 如果您的级别机构有一套方法定义清单,这些定义不是汇编者宣读的,然后变成一个类别物体。 这些说法由评价者逐一执行。
因此,你可以把你喜欢的任何法典放到一个班级机构,并在该班子成立时对该法典进行评价。 在班级机构范围内,<代码>自行受班级约束(即,班级与任何其他班次相同)。
初始化方法是一种在废墟上的构造签名。 是否有关于这些规则的规则? 和 Java一样,如果建筑商不是第1行(或称号后)的话,你就不能把另一个建筑商称作建筑商。
页: 1 建筑商只是工厂方法(有固定限制);如果你只使用一种(更强大的)工厂方法,就没有理由使用设计精良的语言。
设在Ruby的物体建筑工程也一样:物体施工分为两个阶段:al place和 初始<>>。 分配采用一种称为<条码>的公开类别方法,即:<条码/代码>,该方法被定义为“级示例方法”<条码>,通常为never。 它只是为物体分配记忆空间,并设置了几个点,但此时此刻,这个物体并不真正可行。
初始使用人所在地是:这是一种称为<条码>的典型方法,即:条码>,该方法确立了标的的内部状况,使之形成一个连贯、完全界定的国家,可供其他物体使用。
因此,为了充分建立一个新目标,你需要做的是:
x = X.allocate
x.initialize
[说明:目标方案者可承认这一点。]
然而,由于忘记打上“<>条码>(初始><>/代码>)太容易,作为一项一般规则,物体在施工后应完全有效,因此有一个称为“<条码>的新代码”的方便工厂方法,这对你来说都是如此,并看着:
class Class
def new(*args, &block)
obj = alloc
obj.initialize(*args, &block)
return obj
end
end
[说明:实际上,<代码> 初始化<> /code> 是非公开的,因此,必须考虑到绕过诸如此等出入限制:obj.send(:初始化,*args, &block)
。
因此,这就是为什么要构造一个标的:<>->->--->一种公共类别方法Foo.new
,但你implement<>-em> 一种私人实例方法Foo# initialize
,似乎有许多新来者。
回答你的问题:由于初始使用人的方法就像任何其他方法一样,对于你可以做些什么,特别是你可以称之为“<条码>,无论何时何地,不论你是否愿意,都绝对没有任何限制。
BTW:由于 初始化<>/code> 和new
只是正常的方法,没有理由将其称作 初始化
和new
。 这只是一项公约,尽管它相当强大,因为它体现在核心图书馆。 在你的情况下,你想写一个收集类别,收集类别提供替代工厂方法,称为<代码>[
,以便我可以打电话<代码>List[1, 2, 3],而不是<代码>List.new(1, 2, 3)。
就像一个旁观:使用正常方法建造物体,明显的好处是,你可以建造匿名课堂。 这一点在 Java是不可能的,因为绝对没有任何合理的理由。 它之所以不工作的唯一原因是,建筑商的名称与班级相同,匿名班子没有名字,不能有建筑商。
虽然我不敢肯定,为什么你在提出反对之前需要做任何事情。 除非我失踪,否则基本上就没有名单。
class List
def initialize(head=nil, *tail)
@head = head
@tail = List.new(*tail) unless tail.empty?
end
end
a) 列入或列入
class List
def initialize(*elems)
elems.map! {|el| Element.new(el)}
elems.zip(elems.drop(1)) {|prv, nxt| prv.instance_variable_set(:@next, nxt)}
@head = elems.first
end
class Element
def initialize(this)
@this = this
end
end
end
简便链接清单?