2013-11-26 4 views
5

Я читаю «Rails 3 Way» и на странице 39, он показывает пример кода совпадения :to => метод перенаправления. В этом методе существует следующий код. Хотя я знаю, что по модулю делает с числами, я не уверен, что делает%, потому что оба пути и params явно не являются числами. Если кто-то может помочь мне понять использование% в этой ситуации, я был бы признателен.Что делает% в следующем коде?

proc { |params| path % params } 

ответ

10

Это, вероятно, String#% метод, который много работает, как sprintf делает на других языках:

'%05d' % 10 
# => "00010" 

Он может принимать либо один аргумент или массив:

'%.3f %s' % [ 10.341412, 'samples' ] 
# => "10.341 samples" 

Update: Как указывает Филипп, этот метод также принимает хэш:

'%{count} %{label}' % { count: 20, label: 'samples' } 
# => "20 samples" 

Конечно, предполагается, что path является строкой. В Ruby вы никогда не знаете наверняка, если не будете внимательно читать код. Это маловероятно, но это может быть %, означающее modulo.

Вещь, о которой вы можете быть уверен, это метод вызова % на path.

+0

downvoted, потому что вы не обращались к тому, что происходит, когда 'params' является хэшем, который обычно равен – Phlip

+0

@Phlip. Я добавил к этому заметку. Благодарю. – tadman

2

Он делает строчную интерполяцию. В простейшем случае, это эквивалентно:

"foo %s baz" % 'bar' 
#=> "foo bar baz" 

Однако, вы можете использовать более сложные спецификатор формата интерполировать из массива или хэш объекты тоже, такие как Rails Params хэша. См. Методы String#% и Kernel#sprintf для получения подробных сведений о том, как создать допустимую спецификацию формата.

+0

В частности, '' foo =% {foo} "% {: foo => 'bar'}' notation использует '% {foo}' для расширения хэша по значению. Обратите внимание, что некоторые другие языки использовали бы '% (foo) s' there ... – Phlip

+0

@Phlip Это отличный пример того, как сделать интерполяцию с помощью хэш-ключей в спецификаторе формата. Спасибо за добавление конструктивного комментария! –

Смежные вопросы