Несколько уровней методов (или точечная нотация) в Ruby - PullRequest
0 голосов
/ 15 октября 2011

Я видел RubyGem со следующим использованием:

f = Foo.new("joe")
f.say.hello #=> "Hello joe"

В моем Gem , я пытаюсь использовать тот же синтаксис.У меня есть много классов в модуле Dance, но как только я создаю новый экземпляр Dance :: Client, я не могу получить доступ к другим классам.Например:

d = Dance::Client.new("key")
d::Genres.all # => errors out

Я хотел бы получить следующие результаты:

d = Dance::Client.new("key")
d.genres.all

Ответы [ 2 ]

1 голос
/ 16 октября 2011

Вероятно, есть десятки способов сделать это, поэтому вот несколько примеров:

Метод экземпляра клиента возвращает класс жанра

module Dance
  class Client
    def genres
      Genre
    end
  end

  class Genre
    def self.all
      # return all genres
    end
  end
end

КлиентМетод instance возвращает класс коллекции Genre

module Dance
  class Client
    def genres
      GenreCollection.new
    end
  end

  class GenreCollection
    def all
      Genre.all
    end
  end

  class Genre
    def self.all
      # return all genres
    end
  end
end
0 голосов
/ 15 октября 2011

В примере, который вы показываете, "say" - это метод экземпляра, который возвращает что-то с помощью метода "hello".

Аналогично, "genres" будет свойством экземпляра экземпляра Client модуля Dance.

Если вы просто пытаетесь создать экземпляр класса клиента, вы бы использовали нотацию Module :: Class, тогда как ваш пример ошибки пытается сделать это с экземпляром.

...