如何实现其中一些Ruby概念?

时间:2011-12-05 13:51:32

标签: ruby oop

  1. 为了调用MyClass::empty().empty
    我是否需要在MyClass中实现一个空方法?我会在里面写些什么?

  2. 关注,我不确定这样的调用是如何工作的:x = MyClass::empty().add("a").add("b")如果它是空的,那么这只是调用add方法吗?

1 个答案:

答案 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目的的任何指导原则,告诉你一个合理的方法来实现它是很困难的,因为没有上下文,你所展示的内容并没有多大意义。