2011-02-09 2 views
2

Итак, у меня есть модель вопроса и модель ответа и вопрос has_many Answers (это вопрос с несколькими вариантами выбора).ruby ​​on rails block sytax using &:

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

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

questions.collect(&:answers) 

два вопроса:

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

    questions.collect { |q| q.answers } 
    

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

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

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

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

    collect(&:answers.shuffle) 
    

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

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

Благодаря

+0

Вы пытались найти переполнение стека с помощью '[ruby] ampersand'? –

+1

Ха! Ты прав. Это теперь один из нескольких обманов :) http://stackoverflow.com/questions/1961030/ruby-ruby-on-rails-ampersand-colon-shortcut – Brian

+0

Возможный дубликат [Что означает map (&: name) в Ruby?] (http://stackoverflow.com/questions/1217088/what-does-mapname-mean-in-ruby) –

ответ

0

Да, первый вопрос 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] 

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

0

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

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

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