Как стать автором
Обновить

Комментарии 17

Не жадничайте, пишите чаще про такие штуки (-:
А вы спрашивайте если что-то интересно, в личку или в комментах. А я буду в статьях объяснять.
Syntax sugar, конечно, красивый, но мне определенно кажется, что его использование в реальной жизни почти никогда ничем объективным не обосновано, а проблем это создает массу — 99% Ruby-программистов не поймут, как это работает, да и не могу я от них требовать, чтобы они такое понимали. В целом такие трюки скорее сводят всю стройную концепцию языка к чему-то perl-подобному а ля there's more than one way to do it.
Я надеюсь вы это про последний пример )
Я про всё вместе, к сожалению. Если посмотреть исторически — то этот самый «unary &» рождался долго и в муках — сначала в Ruby Extensions, затем в RoR, потом его таки наконец сделали нативным в Ruby 1.9 и только относительно недавно он попал (в виде бэкпорта!) в 1.8.7.

А кроме всего прочего, посмотрите сюда — Вы об этом «забыли» упомянуть в статье или не считаете это важным?
Насчет syntax sugar и скорости выполнения.

DSL и удобство чтения кода, а также приоритет быстроты написания кода перед его выполнением одни из основных принципов Ruby. Лично мне поэтому и нравится писать на Ruby.

Конечно ваше право их отвергать.
> А кроме всего прочего, посмотрите сюда — Вы об этом «забыли» упомянуть в статье или не считаете это важным?

Ради интереса прогнал этот же тест на ruby 1.9.2, со стандартной реализацией Symbol#to_proc. Теперь могу сказать, что такая запись не только короче и приятнее взгляду, но и работает быстрее
pastie.org/1453436
НЛО прилетело и опубликовало эту надпись здесь
Symbol#to_proc появился в Ruby почти десять лет назад в версии1.1.

Амперсанд для последнего аргумента еще раньше.

Хорошая ссылка, надо накидать таких «по теме» в статью.
Оп-па! Был дезинформирован, беру свои слова обратно.

Сейчас проверил в Ruby 1.8.6 метода Symbol#to_proc нет.
Официально он появился вообще только в 1.9 в стандарте. До этого жил в рельсах(или даже конкретно ActiveRecord?), а вообще код сам простой очень, уверен что сам метод начали использовать много раньше — неоднократно встречал просто объявленным в коде без подключения сторонних либ
Вот за это я и люблю Ruby. Пишите про такие штуки — это очень интересно.
Да-да. Именно за такие лаконичные и мощные конструкции я его тоже полюбил. Спасибо автору за статью!
> Расскажу как в Ruby работает такая элегантная конструкция:

> User.all.map &:name

Точно так же как в лиспах уже несколько десятков лет (mapcar #'name users). Правда, в CL с CLOS эта штука проста и логична, а в Ruby поведение слегка туманно.

Ruby — это немного обрезанный Лисп с человеческим лицом. Поздравляю, вы все — лисперы :)
На самом деле магия еще интереснее — здесь мы не ограничены передачей методов без параметров. При помощи &:symol можно передать метод принимающий любое количество аргументов.

Пусть у нас будет вот такой метод в массиве:
class Array
  def map_with_arguments (*args)
    a = []
    self.each do |e| 
      a << yield(e, *args)
    end
    a
  end
end


И вот такой метод в нашем юзере:
class User
  def initialize (name); @name = name; end

  def greeting (pre, suf)
    "#{pre}#{@name}#{suf}"
  end
end


Тогда вот это
a.map_with_arguments("Dear Mr. ", "!") {|el, pre, suf| el.greeting pre, suf}


можно написать вот так:
a.map_with_arguments("Dear Mr. ", "!", &:greeting)
Сорри, забыл написать, что «a» это массив, что-то типа вот такого:
a = [User.new("Jack"), User.new("Bob")]


и тогда на выходе у нас:
["Dear Mr. Jack!", "Dear Mr. Bob!"]
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории