Как реализовать некоторые из этих концепций Ruby? - PullRequest
0 голосов
/ 05 декабря 2011
  1. Для вызова MyClass::empty().empty
    Нужно ли реализовать пустой метод в стороне MyClass?Что бы я написал внутри него?

  2. Ниже я не уверен, как такой вызов мог бы работать: x = MyClass::empty().add("a").add("b")
    Было бы это просто вызовом метода add, если он пуст?

1 Ответ

2 голосов
/ 05 декабря 2011

Что бы вы написали внутри?Что вы хотите, чтобы он делал?

У вас есть метод класса с именем 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 (схематично, поскольку методы являются классом, а не экземпляром)., method), или вы сохраняете возвращаемое значение из последней связки связанных методов.

Но если вы сохраняете экземпляр, какой смысл делать это через MyClass?Опять же, я не могу помочь, но думаю, что вам нужно определить, что вы на самом деле пытаетесь достичь, вместо того, чтобы сосредоточиться на том, как вы можете это сделать.Какова цель?


Во-первых, для массива нет метода add.То, что вы описываете, пока не имеет смысла, если вы не имеете в виду что-то вроде этого:

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, сказать вам разумный способ ее реализации сложно, потому что без контекста то, что вы показали, нене имеет большого смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...