ruby on rails блокирует синтаксис, используя &: - PullRequest
2 голосов
/ 09 февраля 2011

Допустим, у меня есть модель Вопроса, модель Ответа и Вопрос has_many Ответы (это вопрос с множественным выбором).

Предположим, что вопросы - это набор объектов Вопросов.

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

questions.collect(&:answers)

Два вопроса:

  1. Что именно означает этот синтаксис?Расширяется ли оно до

    questions.collect { |q| q.answers } 
    

    или здесь что-то еще происходит?

  2. Есть ли способ сделать

    questions.collect { |q| q.answers.shuffle } 
    

    , используятот же синтаксис?

    collect(&:answers.shuffle) 
    

    не делает этого.

Я не могу найти это в руководствах по рубиновым блокам в Интернете, а поиск этого не делаетработа (поисковые системы игнорируют "&:").Я нашел это в каком-то унаследованном коде.

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 июня 2014

Вы можете выбрать между

questions.collect { |q| q.answers.shuffle }

и тот из @tokland. Ваш код даст вам и другим разработчикам удобочитаемость кода, а решение Toklands предоставит вам легкий доступ. Если вы собираетесь использовать этот шаблон слишком часто, переопределите метод to_proc. Еще используйте трудный путь и не играйте с природой.

0 голосов
/ 09 февраля 2011

Да, первый вопрос является N-дублированным, но относительно второго: нет, вы не можете связывать методы. Однако , ничто не останавливает вас - кроме написания кода, который может озадачить людей - для создания собственного инструмента:

class Symbol
  def to_proc
    proc do |obj| 
      self.to_s.split(/\./).inject(obj, :send)
    end
  end
end

p ["1", "2", "3"].map(&:"to_i.succ")
# [2, 3, 4]

Вы даже можете найти способы отправки аргументов, хотя, вероятно, это будет не очень красиво.

...