Size: a a a

2020 September 01

E

Eugene in RubyRush
представим, я захотел бы такой скоуп:

scope(:by_name) { |name|
 return where(admin: true) if name == "admin"

 where(name: name)
end
источник

E

Eugene in RubyRush
User.by_name("admin") - вернул админов (admin: true)

User.by_name("Vasya") - вернул Вась (name: "Vasya")
источник

E

Eugene in RubyRush
вот ваше исследование показывает, что так бы не работало - был бы LocalJumpError
источник

E

Eugene in RubyRush
а со "стрелочками" - работает:

scope(:by_name), -> { |name|
 return where(admin: true) if name == "admin"

 where(name: name)
end
источник

DG

Denis Gavrilin in RubyRush
выглядит как
def by_name(name)

end
источник

E

Eugene in RubyRush
Denis Gavrilin
выглядит как
def by_name(name)

end
лямбда (->) и будет работать почти как метод обычный
источник

E

Eugene in RubyRush
а прок, созданный из блока, не будет - return не будет работать, он будет пытаться выйти из оригинального метода, который уже давно завершился
источник

E

Eugene in RubyRush
в JS проще - там везде можно и нужно писать return :) впрочем, там нет "блоков" в "рубишном" стиле, только "лямбды" (анонимные функции)
источник

N

Ni in RubyRush
Eugene
а прок, созданный из блока, не будет - return не будет работать, он будет пытаться выйти из оригинального метода, который уже давно завершился
вопрос. если прок такой неудобный и у него нет практического применения — зачем он в руби? (кроме того, что лямбда это тоже прок, но со своими особенностями)
источник

E

Eugene in RubyRush
Ni
вопрос. если прок такой неудобный и у него нет практического применения — зачем он в руби? (кроме того, что лямбда это тоже прок, но со своими особенностями)
proc - это воплощение блока
источник

E

Eugene in RubyRush
руби надо как-то внутри себя хранить и обращаться с блоком
источник

E

Eugene in RubyRush
блок - это языковая конструкция, а Proc - это класс, с помощью которой она внутри языка учитывается
источник

N

Ni in RubyRush
все, понял
источник

Э

Эдем in RubyRush
Eugene
вот о чём в этой теме подумать можно: почему в рельсовые скоупы "лябды" передаются явным аргументом, а не блоком?
В скоуп можно и блок передать кроме аргумента в виде лямбды
источник

E

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

D

Denis in RubyRush
Eugene
scope(:red) { |record| record.where(color: 'red') }
Глаз режет =)
источник

N

Ni in RubyRush
Eugene
блок - это языковая конструкция, а Proc - это класс, с помощью которой она внутри языка учитывается
блок на этапе интерпретации (парсинга кода) превращается в прок?
источник

E

Eugene in RubyRush
Eugene
не знал - но в документации на этом, мягко говоря, не акцентируют внимание - по указанной причине
иначе пришлось бы всё вот это наше обсуждение пришлось туда же в доку по рельсе впихнуть
источник

E

Eugene in RubyRush
Ni
блок на этапе интерпретации (парсинга кода) превращается в прок?
грубо говоря, да

что там на самом деле происходит - дело тёмное, но вполне разумно об этом в такой манере думать
источник

E

Eugene in RubyRush
закономерный вопрос - а почему Ruby бы изначально не учитывать блоки как Lambda, не выдумывая отдельный класс
источник