Сообщение от x-yuri
|
Хотя это уже, конечно, "предварительное" мнение
|
Ага, привычка к конкретной технологии, анализ через её призму. В Ruby же это описывается в доках, так что, для тех, кто изначально изучал Ruby - это не будет казаться чем-то странным.
С другой стороны, последний драфт стандарта по Ruby появился недавно (я не в курсе, вышла ли уже первая официальная версия), возможно, там что-то изменят, а пока все доки по руби - это исходники и доки на официальном сайте. Когда появится стандарт, можно будет однозначно говорить, как должно быть.
Сообщение от x-yuri
|
Как я понял, return в замыкании, созданном с помощью Proc.new завершает функцию, в которой было создано замыкание. И использовать его, за пределами этой функции смысла не имеет
|
Да, но это касается только ключевого слова
return. Proc.new выходит из метода. Если вызвать Proc.new с "return" вне метода, будет ошибка - "неожиданный return".
fn = Proc.new {|x| return x}
fn.call 10 # ошибка
fn1 = Proc.new {|x| x}
fn1.call 10 # 10
def foo
fn = Proc.new do |x| # альтернативная запись блока {...} == do...end
return x
end
fn.call 10
return 'сюда не дошли'
end
foo # 10
Есть ещё несколько случаев, когда return из Proc.new завершится с ошибкой (когда контекст уже мёртв, когда вызывается в другом треде, др.)
Вообще, можно выделить даже не 3, а целых 7 способов создать замыкания в Ruby (но они будут сводиться к 3-ём; остальные 4 - вариации/комбинации предыдущих).
Сообщение от x-yuri
|
может еще какие-нибудь примеры использования Proc.new есть? Т.е. на данный момент я вижу, что это можно использовать для поиска первого элемента
|
Ну, не первого, а любого/группы (и не обязательно поиска). Придумай другие примеры
Я рассказываю, как есть (не привязываясь к ES, либо к другой технологии) - на твою фразу, что "не надо этого хотеть". Иногда это удобно, но в ES такой возможности нет.
Нравится тебе это или нет, хочешь ли ты от этого отгородиться или нет, решил ли ты для себя, что это нужно/не нужно: это есть (в некоторых языках) и разработано с конкретной целью