вгадай мову по wtf
Jul. 16th, 2016 11:55 am
2.2.0 :010 > f 1, 2 { |x| x+1 }
SyntaxError: (irb):10: syntax error, unexpected '{', expecting end-of-input
2.2.0 :011 > f (1, 2) { |x| x+1 }
SyntaxError: (irb):11: syntax error, unexpected ',', expecting ')'
2.2.0 :012 > f(1, 2) { |x| x+1 }
=> 2
what's their problem?!
no subject
Date: 2016-07-16 02:44 pm (UTC)no subject
Date: 2016-07-17 10:43 am (UTC)irb(main):008:0> def f a,b; end
=> nil
irb(main):009:0> f 1, 2 do |x| x+1 end
=> nil
no subject
Date: 2016-07-17 11:23 am (UTC)Вопрос на самом деле в том, "(" - это токен или нет. Если токен отдельный от var name, то это первый язык, в котором нельзя между токенами произвольно _вставлять_ пробелы.
no subject
Date: 2016-07-17 12:58 pm (UTC)no subject
Date: 2016-07-24 10:23 pm (UTC)"use strict", которая меняет смысл остального кода, когда является первой в файле (или теле функции).no subject
Date: 2016-07-25 08:32 pm (UTC)no subject
Date: 2016-07-17 04:39 pm (UTC)no subject
Date: 2016-07-17 07:00 pm (UTC)в руби всегда был синтаксический диабет, но это с лихвой перекрывается литературным программированием рельсов, если смотреть глазами пуриста джавы, например.
(в качестве примера скажу, что "класс программы" ("модели данных") в рельсах имеет 740 публичных методов и 30 приватных)
no subject
Date: 2016-07-17 09:08 pm (UTC)no subject
Date: 2016-07-18 01:35 am (UTC)есть пример, где непонятно?
no subject
Date: 2016-07-18 07:08 pm (UTC)Ок, я могу понять что-то типа горизонтальной композиции кода (навроде частного одностороннего случая pipes), но как-то не очень понятно, как бы оно выражалось в общем случае?
2.2.0 :004 > f {|x| yield (x+1)} {|y| yield y*2} {|z| z}
SyntaxError: (irb):4: syntax error, unexpected { arg, expecting end-of-input
no subject
Date: 2016-07-25 08:39 pm (UTC)map {|e| e + 1}.
map {|e| e*2}.
reduce {|e, a| e + a }
я всё хотел накопать сюда хороших и разных рабочих примеров реальных задач, но не найду время. но, в общем, так можно и олимпиадные задачи мап-мап-мап-редьюс, так и файлы-отчёты-бог знает что ещё таскать, готовить и выполнять. мап, флатмап и редьюс (в основном сложение, ага) рулят)
no subject
Date: 2016-07-25 09:29 pm (UTC)no subject
Date: 2016-07-26 08:32 pm (UTC)(т.е. ничем.)
no subject
Date: 2016-07-17 07:02 pm (UTC)Mapping = {
a: begin
вот где-то здесь со скобками расползается нормальная компиляция
end,
}
А так, за все три года в синтаксис упирался только два раза, и всё.
no subject
Date: 2016-07-17 09:05 pm (UTC)no subject
Date: 2016-07-18 01:46 am (UTC)там есть if, а есть unless - чтобы лучше читалось.
есть даже Object#nil? , если это поможет вот прям глубже раскрыть мысль, что в коллекции ну совсем неожиданно встретятся пустые значения.
Да и вообще, похож на английский как никакой другой.
ну и рельсы подали пример как делать: "пишите код с главным приоритетом - удовольствие программиста"
no subject
Date: 2016-07-18 07:25 am (UTC)expect(blah).to be_falsy например? Так тут как раз нужно помнить, где скобки, где точки, где пробелы, а где подчеркивания :-) Потому что сущности разных видов. И сущности несовместимы с традиционными способами программирования:
x = expect(blah).to
x be_falsy
не работает.
no subject
Date: 2016-07-18 09:38 am (UTC)x.should == false (и ничего запоминать не надо) или x.should be_false
(https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers)
но потом пришли пуристы, и теперь это expect(x).to be_falsey
(https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/be-matchers)
(пуристы хотели, чтобы метод should не расширял каждый класс методом should. я тоже хотел. никому не мешало; стало хуже.)
no subject
Date: 2016-07-18 09:38 am (UTC)no subject
Date: 2016-07-18 12:59 pm (UTC)1. в руби любой метод обязан принимать один скрытый аргумент - "блок кода".
он может вызвать это замыкание, а может игнорировать, но отказаться от него нельзя, если передают.
отсюда все конструкции вида
scope { where(username: 'Joe') }
expect { 1 + 1 + 1/0 }
методу expect передали замыкание, которое можно вызывать, забрав значение или перехватывая эксепшны.
цепочка методов тогда будет выглядеть как method1 { code1 }.method2(arg1,arg2) { code2 }.method3 arg1, arg2
2. в руби часто можно опустить скобки.
a b, c, d это a(b,c,d)
a b c d это a(b(c(d)))
Cоответственно, expect(arg1) или expect { code1 } вычисляет значение теста, .to это (не тестировал, но видимо) синтаксический сахар, а дальше идёт сам матчер be(..) от чего угодно.
по идее, так и работает.
no subject
Date: 2016-07-18 07:04 pm (UTC)no subject
Date: 2016-07-25 08:35 pm (UTC)передача блока как замыкания
def f1 blk
blk.call
end
f(proc {..})
передача с красивостями (ровно то же самое по смыслу):
def f1 &blk
blk.call
end
f {..}
no subject
Date: 2016-07-25 09:21 pm (UTC)f1 b1 b2 b3,
где все общаются "горизонтально" с помощью, скажем, yield, хотя и в одну сторону. Однако, нет, нету такого.
no subject
Date: 2016-07-26 08:34 pm (UTC)no subject
Date: 2016-07-26 08:38 pm (UTC)Пример, где было бы интересно:
readReq process writeResponse
Все три писались бы совсем в другом стиле, а композируются как трубы.
no subject
Date: 2016-07-26 08:58 pm (UTC)readReq.bytes.each_cons(1024).map {|e| ..}.each(|e| STDOUT.write e}
блок от функции ничем не отличается, кроме того что это особый аргумент, которым можно не пользоваться.
можно передавать функции как обычные аргументы, в любых количествах.
никакой другой разницы нет, кроме чисто синтаксической.
no subject
Date: 2016-07-18 09:38 am (UTC)no subject
Date: 2016-07-18 09:41 am (UTC)не знаю, в инбоксе не показывает дополнительных комментов, кроме тех, что есть здесьа, нашел, расспамил