为了调用MyClass::empty().empty
我是否需要在MyClass中实现一个空方法?我会在里面写些什么?
关注,我不确定这样的调用是如何工作的:x = MyClass::empty().add("a").add("b")
如果它是空的,那么这只是调用add方法吗?
答案 0 :(得分:2)
你会在里面写些什么?你想要它做什么?
你有一个名为empty
的类方法,它返回一个empty
方法的东西,或者(a)没有参数,或者(b)它们是默认的。
class MyClass
def self.empty
return WithEmpty.new # Or existing WithEmpty
end
end
它还需要返回具有add
方法的东西,并返回自己。
class WithEmpty
def initialize
@a_list = []
end
def add x
@a_list << x
self
end
def empty
@a_list.empty?
end
end
如果你描述了你想要做的事情,那就更容易/更快。这并不是很明显。
pry(main)> MyClass::empty()
=> #<WithEmpty:0xa01a090 @a_list=[]>
pry(main)> MyClass::empty().empty
=> true
pry(main)> MyClass::empty.empty
=> true
pry(main)> MyClass::empty.add("hi").add("bye")
=> #<WithEmpty:0x9fc8d1c @a_list=["hi", "bye"]>
现在你没有立即进入“内部”类的列表,除非你将它保存在MyClass
(粗略,因为方法是类,而不是实例,方法),或者保存返回来自最后一串链接方法的价值。
但是如果您保存实例,那么通过MyClass
执行该操作的重点是什么?同样,我不禁认为你需要定义你实际想要完成的事情,而不是专注于你如何实现它。目标是什么?
首先,数组没有“添加”方法。你所描述的内容毫无意义,除非你的意思是这样的:
class MyClass
def self.empty
return MyClass.new
end
def initialize
@arr = []
end
def empty
@arr.empty?
end
def add x
@arr << x
self
end
end
然后:
pry(main)> MyClass.empty
=> #<MyClass:0x9aea390 @arr=[]>
pry(main)> MyClass.empty.add("ohai").add("kthxbai")
=> #<MyClass:0x99f505c @arr=["ohai", "kthxbai"]>
但是又一次:你以一种我觉得不合理的方式混合类和实例方法。你想如何访问该阵列? MyClass
有什么意义?为什么不使用数组?
pry(main)> a = []
=> []
pry(main)> a.empty?
=> true
pry(main)> a << "ohai" << "kthxbai"
=> ["ohai", "kthxbai"]
pry(main)>
pry(main)> a.empty?
=> false
没有MyClass
目的的任何指导原则,告诉你一个合理的方法来实现它是很困难的,因为没有上下文,你所展示的内容并没有多大意义。