Ruby do / end vs braces - PullRequest
       5

Ruby do / end vs braces

19 голосов
/ 01 апреля 2011

Почему это выражение карты дает разные результаты в зависимости от того, использую ли я фигурные скобки или do / end?

a = [1,2,3,4,5]


p a.map { |n|
    n*2
}  
#=> [2,4,6,8,10]


p a.map do |n|
    n*2
end  
#=> [1,2,3,4,5]

Ответы [ 3 ]

20 голосов
/ 01 апреля 2011

Это потому, что вторая строка интерпретируется как:

p(a.map) do ... end

вместо:

p(a.map do ... end)

В этом случае грамматика неоднозначна, и do, кажется, не связывает так сильно, как {.

4 голосов
/ 01 апреля 2011

Это связано с разницей в ассоциативности символа { и ключевого слова do.

В первом случае блок интерпретируется как аргумент блока для функции map. Результатом функции map является аргумент функции p.

Во втором случае блок интерпретируется как аргумент блока функции p, тогда как a.map интерпретируется как первый аргумент функции p. Поскольку a.map оценивается как a, это печатает исходный массив. В этом случае блок фактически игнорируется.

2 голосов
/ 01 апреля 2011

С синтаксисом do/end вы передаете блок p в качестве второго аргумента, а не на карту.Вы получаете тот же результат с:

p a.map

Блок игнорируется p, поскольку он ничего не производит на inspect.

...