Ruby stringify метод цепочки - PullRequest
0 голосов
/ 14 ноября 2011

Допустим, у меня есть объект Ruby с именем Foo. Этот код приведет к следующему:

Foo.bar.baz #=> "bar baz"

Как я мог достичь этого. (Я знаю, что это кажется бессмысленным и, вероятно, нарушает некоторые соглашения, мне просто было интересно посмотреть, как этого можно достичь.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2011
class Object
    def bar; [(instance_of?(String)? self : nil), "bar"].join(" ") end
    def baz; [(instance_of?(String)? self : nil), "baz"].join(" ") end
end
Foo.bar.baz #=> "bar baz"
Foo.baz.bar #=> "baz bar"
0 голосов
/ 14 ноября 2011

Ужасный хаккейный способ сделать эту ужасную хаккейную вещь - это использовать method_missing.

class Ouch
  def initialize
    @log = ""
  end
  def method_missing(method)
    if @log.empty?
      @log = method.to_s
    else
      @log += " #{method}"
    end
    self
  end

  def run 
    @log
  end
end

Теперь вы можете сделать:экземпляр Ouch метода, которого он не знает (ничего кроме запуска), возьмите новый из этого метода и добавьте его к строке журнала, хранящейся как переменная экземпляра (@log) внутри вашего экземпляра.Наконец, вам нужна какая-то функция извлечения, например, run, чтобы объект знал, что вы закончили и хотите вернуть накопленный журнал.Надеюсь, это поможет.

[EDIT]

Чтобы быть совершенно ясным, method_missing - это "волшебная" функция Ruby, которая вызывается всякий раз, когда вызывается метод объекта, который объект не распознает.

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