Size: a a a

2020 September 01

E

Eugene in RubyRush
а потому что в блоках-та вам полезна эта особенность - выходить "через голову" "родительского" метода
источник

S

Sergey in RubyRush
конструкция типа .select(&:even?) внутри делает :even?.to_proc, кстати
источник

E

Eugene in RubyRush
5.times { |i| break if i > 3 }
источник

Э

Эдем in RubyRush
Eugene
не знал - но в документации на этом, мягко говоря, не акцентируют внимание - по указанной причине
Ну вот из доки пример если брать, то можно вызывать Shirt.red.dom_id. Х.з. зачем это надо было. Может кто-то и использует
источник

E

Eugene in RubyRush
Sergey
конструкция типа .select(&:even?) внутри делает :even?.to_proc, кстати
да, и получается proc { |x| x.even? }
источник

E

Eugene in RubyRush
Эдем
Ну вот из доки пример если брать, то можно вызывать Shirt.red.dom_id. Х.з. зачем это надо было. Может кто-то и использует
не понял, как это связано с блоками vs лямбдами
источник

N

Ni in RubyRush
хорошо, но с другой стороны. прок не нужен для программиста, потому что он пользуется блоками и лямбдами. можно ли в принципе запретить использования прока?
источник

E

Eugene in RubyRush
Eugene
5.times { |i| break if i > 3 }
подумайте, как метод times работает в таком случае

если бы внутри была обычная лямбда, то break бы вышел ИЗ ЭТОЙ ЛЯМБДЫ, а ВНЕШНИЙ цикл продолжился бы

но break выходит из самого метода times
источник

Э

Эдем in RubyRush
Eugene
не понял, как это связано с блоками vs лямбдами
К вопросу, почему блок не прокидывают. Чтоб вот так можно было прицепом сделать
источник

E

Eugene in RubyRush
Ni
хорошо, но с другой стороны. прок не нужен для программиста, потому что он пользуется блоками и лямбдами. можно ли в принципе запретить использования прока?
ну, в Ruby так не принято - вы в любом случае сталкиваетесь с Proc-ом, когда "захватываете" его через &:

def m(&blk)
 puts blk.class # Proc
end
источник

Э

Эдем in RubyRush
А зачем это на практике -- х.з.
источник

S

Sergey in RubyRush
Eugene
подумайте, как метод times работает в таком случае

если бы внутри была обычная лямбда, то break бы вышел ИЗ ЭТОЙ ЛЯМБДЫ, а ВНЕШНИЙ цикл продолжился бы

но break выходит из самого метода times
ну как в доке и описано, что break выходит из метода, в который передан блок. т.е из метода times
источник

E

Eugene in RubyRush
Эдем
К вопросу, почему блок не прокидывают. Чтоб вот так можно было прицепом сделать
всё равно чё-то не пойму

ты о том, что при вызове Shirt.red ты получаешь отнюдь не результат выполнения блока (или лямбды), а некий "обёрточный" объект?
источник

E

Eugene in RubyRush
Sergey
ну как в доке и описано, что break выходит из метода, в который передан блок. т.е из метода times
да, и это удобно, как раз чтобы прерывать циклы
источник

E

Eugene in RubyRush
аналогично во всех будет - each, select и т. д. и т. п.
источник

S

Sergey in RubyRush
@eugzol а можешь прояснить что имеется в виду в скобках?
In non-lambda procs, break means exit from the method which the block given for. (and will throw LocalJumpError if invoked after the method returns);
источник

E

Eugene in RubyRush
в языках, которые делали не японцы, это по-другому реализуется - там вас из итератора просят в явном виде, например: https://stackoverflow.com/questions/52432333/how-can-i-break-out-of-a-enum-reduce-in-elixir
источник

Э

Эдем in RubyRush
Eugene
всё равно чё-то не пойму

ты о том, что при вызове Shirt.red ты получаешь отнюдь не результат выполнения блока (или лямбды), а некий "обёрточный" объект?
Если б блок был бы, а не аргумент в виде лямбды, то пришлось бы что-то другое придумывать для того dom_id
источник

E

Eugene in RubyRush
# Elixir

[1,2,3,-4,5,6,-1] |> Enum.reduce_while(0, fn x, acc ->
  if x > 0, do: {:cont, acc + x}, else: {:halt, acc}
end )
источник

E

Eugene in RubyRush
во второй строке говорится: если x > 0, то вернуть "массив" из двух элементов {:cont, acc + x}

иначе вернуть "массив" из двух элементов {:halt, acc}
источник