Comments 34
По-моему с Tap читаемость только ухудшилась
Тут разумнее привести такой код:
Вместо
Но, как по мне, то читать легче без tap. Тут надо смотреть, чего мы хотим: мало строк или хорошая читаемость.
User.new.tap{|u| u.name = "Alex" }.save!
Вместо
u = User.new
u.name = "Alex"
u.save!
Количество строк одна против 3. А также лишняя переменная.Но, как по мне, то читать легче без tap. Тут надо смотреть, чего мы хотим: мало строк или хорошая читаемость.
Если для ActiveRecod то можно и без tap
тоже самое на create, update
User.new do |user|
user.name = 'Alex'
end.save!
тоже самое на create, update
то, что вы привели в качестве примера, не пройдёт ни один стайлгайд.
.tap используется в основном для возвращения значения внутри метода:
вместо
оно не сокращает количество строк, а улучшает читаемость
.tap используется в основном для возвращения значения внутри метода:
def make_admin
User.new.tap do |user|
user.role = 'admin'
end
end
вместо
def make_admin
user = User.new
user.role = 'admin'
user
end
оно не сокращает количество строк, а улучшает читаемость
Так а где улучшение читаемости-то? То же ж самое абсолютно.
Да ни разу он не для улучшения читаемости просто. Бывает, что нужно что-то выполнить на промежуточном результате:
def my_f
User.new.tap { |u| puts “New user: #{u}” }
end
Напечатали лог и вернули вновь созданного юзера из функции. Вместо:
def my_f
user = User.new
puts “New user: #{user}”
user
end
def my_f
User.new.tap { |u| puts “New user: #{u}” }
end
Напечатали лог и вернули вновь созданного юзера из функции. Вместо:
def my_f
user = User.new
puts “New user: #{user}”
user
end
нет лишней переменной.
Возможность проставлять лямбду при помощи -> появилась сравнительно недавноВ 1.9 она уже есть. Недавно?! xD
В следующий раз лучше выбирайте пост для перевода. Если человек ведёт блог, это ещё не значит, что он профессионал языка.
Кроме выше означенных проблем, вот ещё. Назовите разницу между
a || a = b
и
a = a || b
С логической точки зрения её нет.
Кроме выше означенных проблем, вот ещё. Назовите разницу между
a || a = b
и
a = a || b
С логической точки зрения её нет.
а вот **c принимет только параметры в формате ключ/значение, после чего отдаст нам хэш.
О божечки, они изобрели **kwargs :D
И правильно сделали, этого не хватало, были всякие костыли типа extract_arguments в начале многих методов. Кстати говоря, именно поэтому 5-е рельсы активно перепиливают на использование **kwargs везде (следовательно минимальная версия Ruby там будет 2.2).
Оно же с 2.0 появилось? Например, здесь пишут, что это так: magazine.rubyist.net/?Ruby200SpecialEn-kwarg
Это не считая того, что синтаксический сахар для последнего аргумента-хэша и в 1.9 был. Менее удобный, правда, так как значения аргументов по умолчанию выставлялись в теле функции и проверка наличия избыточных аргументов делалась вручную и довольно редко.
Это не считая того, что синтаксический сахар для последнего аргумента-хэша и в 1.9 был. Менее удобный, правда, так как значения аргументов по умолчанию выставлялись в теле функции и проверка наличия избыточных аргументов делалась вручную и довольно редко.
Важно понять, что этот оператор работает не так:
a || a = b
и не так: a = a || b
:irb(main):001:0> b = :caveat
=> :caveat
irb(main):002:0> a1 ||= b
=> :caveat
irb(main):003:0> a2 || a2 = b
NameError: undefined local variable or method `a2' for main:Object
Так все таки, как он работает?
Работает как и говорили выше
Поэтому много проблем влечёт ||=, так как забывают люди постоянно про то, что с Bool данную конструкцию использовать нельзя.
Вроде как и понятно почему, но когда идёт несколько идентичных методов или присваиваний и среди них забываешь про Bool становится очень обидно за убитое на дебаг время.
a = b unless a
Поэтому много проблем влечёт ||=, так как забывают люди постоянно про то, что с Bool данную конструкцию использовать нельзя.
irb(main):001:0> a = 42
=> 42
irb(main):002:0> a ||= 77
=> 42
irb(main):003:0> a = false
=> false
irb(main):004:0> a ||= true
=> true
irb(main):005:0> a
=> true
Вроде как и понятно почему, но когда идёт несколько идентичных методов или присваиваний и среди них забываешь про Bool становится очень обидно за убитое на дебаг время.
Собсно я еще над этим подумал, и получается, что как раз
так оно и работает :) То есть так, как в посте помечено коментарием «Неверно». Поправьте, в чем неправ.
a = a || b
так оно и работает :) То есть так, как в посте помечено коментарием «Неверно». Поправьте, в чем неправ.
def total
@total ||= (1..100000000).to_a.inject(:+)
end
Только когда пишите такое, помните, что это не thread-safe.
Стоит отметить, что ||= нужно применять с осторожностью для вычислений, которые могут вернуть nil, в таком случае результат не будет закеширован. Для решения этой проблемы есть гемы типа memoist.
Sign up to leave a comment.
Несколько полезных ruby-трюков, которые (возможно) улучшат ваш код