LINUX.ORG.RU

Релиз Ruby 2.1

 


5

9

Прекрасный новогодний подарок преподнес Matz всем любителям и профессионалам программирования на языке Ruby — релиз Ruby 2.1. В целом новый выпуск языка и среды исполнения написанного на нем кода продолжает эволюционное развитие Ruby и практически не вносит кардинальных или ломающих изменений. Кроме того, что стандартный интерпретатор стал работать быстрее, заявлены следующие отличительные особенности Ruby 2.1:

  • Кэширование названий методов. Теперь когда интерпретатор встречает название какого-то метода объекта, он производит поиск этого метода, после чего сохраняет указатель на него в байткоде. Если у вас есть код, в котором для объектов одного и того же типа часто вызывается один и тот же метод, работа этого участка программы будет ускорена. Для проверки корректности сохраненного значения в кэше MRI использует внутренние счетчики потенциально опасных в плане инвалидации кэшированного метода действий.
  • Поддержка профайлинга кода на уровне MRI. Вы можете измерять производительность вашего кода и отслеживать работу сборщика мусора (благодаря подписке на события запуска/останова сборщика мусора и создания/удаления объектов).
  • Обновленный сборщик мусора RGenGC (с поколениями). Более подробно с ним можно ознакомиться в захватывающей презентации [pdf] с RubyConf.
  • Добавлены суффиксы i и r для записи комплексных чисел.
  • Определение функции (def) теперь возвращает символ ее названия вместо nil.
  • Работа над неоднозначностью объявления refinements, то есть расширения модуля или класса в пределах одного локального файла. Подробнее [pdf].
  • Наконец-то Array#to_h — создание хэша из массива.
  • Сокращение записи «замороженных» строк (str = «mystring"f).
  • Для ускорения операций над очень большими числами используется GMP (The GNU Multiple Precision Arithmetic Library).
  • Обновлены стандартные библиотеки BigDecimal, JSON, NKF, Rake, RubyGems и RDoc.
  • Удалена поддержка из коробки curses (гем curses теперь при необходимости надо установить отдельно).
  • А также многое другое! Подробный список изменений прилагается.

Релиз явно удался на славу и его обязательно стоит попробовать. Исходные коды уже доступны на официальном сайте проекта.

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: ymn (всего исправлений: 1)
Ответ на: комментарий от special-k

Я говорю о том, что string.join будет проверять тип подставленного объекта и выполнять соответствующий фрагмент кода. А [].join содержит только код склеивания объектов своего типа, без ветвлений.

ЯННП. Тебе нужно, чтобы у каждого класса был метод join или что?

' '.join(MySuperClass()) вернул TypeError, как мне научить join работать с моим классом, это вообще возможно?

Написать my_join_with_blackjack_and_hookers и либо использовать его напрямую, либо манкипатчить им существующие классы // К.О.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Ты не ответил на вопрос.

На вот этот?

anonymous> Что следующее?

Так ты сам на него ответил: «Наверное «lol».widgetwithtitle(), оно же относится к данной строке». Ну, тебе виднее.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Тебе нужно, чтобы у каждого класса был метод join или что?

В общем, да. Но в месте с тем я объясняю почему это лучше с т.з. отладки и универсальности.

либо манкипатчить им существующие классы

Ну.. это же плохо?

Нет, если очень хочется иметь join в стринге, и чтобы он был расширяемым, можно сделать, чтобы он вызывал какой-нибудь __join__ у объекта, и т.о. реализация, все равно, будет в объекте.

special-k ★★★★
()
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от tailgunner

На вот этот?

Ага.

«Наверное «lol».widgetwithtitle(), оно же относится к данной строке». Ну, тебе виднее.

Это ты мастер питона и с гвидо на одной волне, откуда мне то виднее? Ты знаешь, какие методы относятся к строке, а какие нет, объясни мне эту границу.

anonymous
()
Ответ на: комментарий от special-k

Тебе нужно, чтобы у каждого класса был метод join или что?

В общем, да

С какой семантикой? Почему именно у _каждого_ - зачем join, например, целому числу?

манкипатчить им существующие классы

Ну.. это же плохо?

Прежде всего, плохо переопределять встроенные методы для получения разной семантики.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ты знаешь, какие методы относятся к строке, а какие нет, объясни мне эту границу.

У строки нет метода widgetwithtitle // К.О.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Мы сейчас разговариваем про твою убогую логику.

И это мне говорит человек для которого нормально то что

str.split(delim).join(delim) != str

Скажи мне как часто ты обмазываешься разбиваешь строки, стобы их потом снова собрать?

Как моя частота разбивки строк оправдывает криворукость ruby core dev team?

anonymous
()
Ответ на: комментарий от anonymous

У строки нет метода widgetwithtitle // К.О.

Спасибо кэп. На будущее запланирован, нет?

Нет.

Почему?

Название дурацкое.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

И это мне говорит человек для которого нормально то что

Ты правильно проанализировал ситуацию, всё именно так.

Как моя частота разбивки строк оправдывает криворукость ruby core dev team?

Никак. Она как бы подсказывает нам, что в данном случае это была не криворукость.

Не, я бы понял человека, который начал удивляться, почему

3 / 2 * 2 != 3

Но с какой стати метод split должен быть обратимым, я не понимаю.

anonymous
()
Ответ на: комментарий от tailgunner

Название дурацкое.

Кажется я начинаю понимать питонистов. А какое название подошло бы?

anonymous
()
Ответ на: комментарий от anonymous

Кажется я начинаю понимать питонистов.

Тебе только кажется.

А какое название подошло бы?

А что делает метод?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

А что делает метод?
«lol».widgetwithtitle

Виджет с заглавием, кэп. Заглавие - строка, которая сюда относится, насколько я понимаю питонистскую логику.

anonymous
()
Ответ на: комментарий от anonymous

А какое название подошло бы?

А что делает метод?

Виджет с заглавием, кэп

Ну, если виджет - это оконный виджет, то у твоего метода еще и семантика дурацкая. А хоть что-нибудь недурацкое у него есть? %)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

А хоть что-нибудь недурацкое у него есть? %)

Нет, он именно что дурацкий. Я просто хочу понять, чем он потвоему от join в строке отличается.

anonymous
()
Ответ на: комментарий от anonymous

Обратимый метод лучше чем необратимый. С какой стати метод split должен быть необратимым, я не понимаю.

anonymous
()
Ответ на: комментарий от tailgunner

Что ты здесь называешь семантикой?

Смотри, предположим я циклично вызываю 'string'.join для массива объектов, при этом 'string'.join умеет работать не со всеми из них. И в случае с питоном (и любой подобной реализации) мне придется

Написать my_join_with_blackjack_and_hookers и либо использовать его напрямую, либо манкипатчить им существующие классы // К.О.

В случае же с руби, т.е. с методом join у объекта, я буду просто его вызывать. И если окажется что у какого-то объекта этот метод не реализован, я просто его добавлю. Код останется лаконичен и легок для понимания.

special-k ★★★★
()
Ответ на: комментарий от anonymous

Я просто хочу понять, чем он потвоему от join в строке отличается.

Тем, что join в качестве результата выдает строку, а не объект оконной системы. Ах да, и еще название у него понятное %)

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Обратимый метод лучше чем необратимый.

Нет. Если его обратимость никогда не используется, то она не нужна.

С какой стати метод split должен быть необратимым, я не понимаю.

Чтоб руками пустой элемент не отрезать.

anonymous
()
Ответ на: комментарий от anonymous

Спит для криворуких от криворуких:

2.1.0 :012 > ',2,3'.split(',')
 => ["", "2", "3"] 
2.1.0 :013 > '2,3,'.split(',')
 => ["2", "3"] 

anonymous
()
Ответ на: комментарий от anonymous

Чтоб руками пустой элемент не отрезать.

Ты когда нибудь слышал про single responsibility principle? Split должен только разбивать строку на элементы и не делать какой-то левой фигни, это не его заботы.

anonymous
()
Ответ на: комментарий от special-k

Что ты здесь называешь семантикой?

Семантику.

я циклично вызываю 'string'.join для массива объектов, при этом 'string'.join умеет работать не со всеми из них.

Я бы сказал, что string.join умеет работать только со строками и последовательностями строк; если ты хочешь объединять всё подряд, ты вызываешь string.join для str(obj).

В случае же с руби, т.е. с методом join у объекта, я буду просто его вызывать. И если окажется что у какого-то объекта этот метод не реализован, я просто его добавлю.

Напомни, какую именно задачу ты решаешь.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Тем, что join в качестве результата выдает строку, а не объект оконной системы.

Ага. А такой метод ты сочтёшь дурацким: 'lol'.concatWidgetTitle(widget)? Относится к строке, выдаёт строку.

Ах да, и еще название у него понятное %)

Ну не смешно же. Любой, не упоротый питоном, человек не поймёт эту фигню:

>>> 'a'.join('b')
'b'
>>> 

anonymous
()
Ответ на: комментарий от anonymous

Лучше, коллега, гораздо лучше. Вот этот момент действительно криворук, я считаю.

anonymous
()
Ответ на: комментарий от anonymous

Ты когда нибудь слышал про single responsibility principle? Split должен только разбивать строку на элементы и не делать какой-то левой фигни, это не его заботы.

А ты когда нибудь слышал, что такое principle и для чего оно нужно?

anonymous
()
Ответ на: комментарий от anonymous

Тем, что join в качестве результата выдает строку, а не объект оконной системы.

Ага. А такой метод ты сочтёшь дурацким: 'lol'.concatWidgetTitle(widget)? Относится к строке, выдаёт строку.

Ну, название у него очевидно дурацкое; семантика у него тупо лишняя, ибо покрывается 'lol' + widget.getTtitle()

Любой, не упоротый питоном, человек не поймёт эту фигню:

>>> 'a'.join('b')

Просто для протокола - я этой фигни тоже не понимаю. Что она делать-то должна?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Я бы сказал, что string.join

просто функция, которая возвращает строку, и я в праве хотеть, чтобы она умела работать с объектом MySuperClass, и я в праве хотеть тривиальную реализацию этой задачи.

какую именно задачу ты решаешь.

Duck typing

special-k ★★★★
()
Ответ на: комментарий от anonymous

Для того что бы не получались такие говноподелки как ruby. Может и это для тебя логично?

2.1.0 :001 > ar = [0, 1]
 => [0, 1] 
2.1.0 :002 > ar[0..0]
 => [0] 
2.1.0 :003 > ar[1..1]
 => [1] 
2.1.0 :004 > ar[2..2]
 => [] 
2.1.0 :005 > ar[3..3]
 => nil 

anonymous
()
Ответ на: комментарий от tailgunner

Ну, название у него очевидно дурацкое; семантика у него тупо лишняя, ибо покрывается 'lol' + widget.getTtitle()

То есть это всё, что тебя в нём смущает?

Просто для протокола - я этой фигни тоже не понимаю. Что она делать-то должна?

1. Забудь на пару секунд питон вообще и что делает метод join в частности.

2. Представь что учишь новый язык.

3. Для чистоты эксперемента, представь что ты видишь такую фигню: 'а'.join(['b'])

4. Что она по твойму должна вернуть?

anonymous
()
Ответ на: комментарий от anonymous

Для того что бы не получались такие говноподелки как ruby.

Это не правильный ответ. Слово principle конкретно к руби относится чуть более чем никак. Иди за словарём.

anonymous
()
Ответ на: комментарий от anonymous

То есть это всё, что тебя в нём смущает?

На первый взгляд - да. Я что-то упустил?

3. Для чистоты эксперемента, представь что ты видишь такую фигню: 'а'.join(['b'])

Вот именно эта форма - ХЗ. Ответ «она должна объединить 'a' и 'b'» отметается тем, что 'b' - элемент списка, стандартная питоновская семантика отметается тем, что в списке только один элемент.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Ты руби уже выучил? В каждом треде про руби тебя постоянно кто то ловит на том что ты руби знаешь очень плохо...

Для фанбойства знать предмет не обязательно, а может даже и вредно.

AlexKiriukha ★★★★
()
Ответ на: комментарий от anonymous

Слово principle конкретно к руби относится чуть более чем никак.

Принцип единственной обязанности можно применить к чему угодно в том числе и к кривому рубишному сплиту. Ида за мозгом.

anonymous
()
Ответ на: комментарий от anonymous

FIXED

Принцип единственной обязанности можно применить к чему угодно в том числе и к кривому рубишному сплиту. Иди за мозгом.

anonymous
()
Ответ на: комментарий от tailgunner

На первый взгляд - да. Я что-то упустил?

Как бы да. Скажем мы сделали метод concatWidgetTitle в классе string, который умеет вынимать загаловки из tk, gtk и qt. Внезапно мы делаем биндинг efl на питон. concatWidgetTitle не работает с новыми виджетами. Что делать?

Вот именно эта форма - ХЗ. Ответ «она должна объединить 'a' и 'b'» отметается тем, что 'b' - элемент списка, стандартная питоновская семантика отметается тем, что в списке только один элемент.

Во первых, чем ты читаешь, а? Забудь питон, тебе первым пунктом написал. Во вторых, очевидно, что ты не знаешь на 100%, что эта фигня со списком будет делать. Возможно ты даже не знаешь, что такое списки. Я тебя прошу сделать предположение, что оно сделает.

anonymous
()
Ответ на: комментарий от anonymous

Принцип единственной обязанности можно применить к чему угодно в том числе и к кривому рубишному сплиту. Иди за мозгом.

А ты чем читаешь? Я тебя не спрашивал про принцип единственной обязанности, я тебя спрашивал, что такое принцип и зачем он нужен. А теперь иди за словарём.

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

Скажем мы сделали метод concatWidgetTitle в классе string, который умеет вынимать загаловки из tk, gtk и qt. Внезапно мы делаем биндинг efl на питон. concatWidgetTitle не работает с новыми виджетами.

EFL-проблемы. Виджеты EFL могут забить на, например, __repr__ или __str__, и что?

Во первых, чем ты читаешь, а?

Спроси себя об этом.

Забудь питон, тебе первым пунктом написал

Внимательно смотри первую часть ответа.

Возможно ты даже не знаешь, что такое списки. Я тебя прошу сделать предположение, что оно сделает.

Должен ли я забыть, что умею читать? Что знаю языки программирования?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ого. Перепроверил в 2.0, так и есть. Объяснить не могу.

AlexKiriukha ★★★★
()
Ответ на: комментарий от tailgunner

EFL-проблемы.

У efl нет проблем, она же памятник библиотека. Это проблема программистов, которые этот быдлокод будут разгребать.

Проблема в том, что у нас класс string из-за новго метода стал зависить от конкретной реализации виджетов. И при изменении/удалении/добавлении новых реализаций виджетов, нам надо менять не только сами реализации, но ещё и string. Твой кэп.

Внимательно смотри первую часть ответа.

Вот эту «Вот именно эта форма - ХЗ.» ?

То есть ты признаёшь, что у этого метода ни хрена не понятное название?

anonymous
()
Ответ на: комментарий от tailgunner

Должен ли я забыть, что умею читать? Что знаю языки программирования?

Ещё раз тебя спрашиваю, чем ты читаешь? Разве я просил тебя забыть читать? Я тебе предложил очевидный способ проверить, на сколько понятна семантика этого метода, а ты всё юлишь и юлишь.

anonymous
()
Ответ на: комментарий от anonymous

Проблема в том, что у нас класс string из-за новго метода стал зависить от конкретной реализации виджетов

А, то есть ты знаешь об уровнях абстракции и, наверное, слышал словосочетание layering violation. Ну так зачем ты притворялся дурачком со своим widgetwithtitle?

То есть ты признаёшь, что у этого метода ни хрена не понятное название?

То есть я признаю, что из данной конкретной формы вызова ничего не могу предположить о результате.

Разве я просил тебя забыть читать?

Забыть о том, что [] - это список, ты тоже не просил.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

А, то есть ты знаешь об уровнях абстракции и, наверное, слышал словосочетание layering violation. Ну так зачем ты притворялся дурачком со своим widgetwithtitle?

У меня к тебе встречный вопрос, нафига ты споришь с анонимусами на лоре?

То есть я признаю, что из данной конкретной формы вызова ничего не могу предположить о результате.

О том и речь. Если это не понятно из названий класса и метода, значит это херовые названия.

Забыть о том, что [] - это список, ты тоже не просил.

Спасибо кэп. Я такого и не утверждал. Прежде чем ты меня опять начнёшь цитировать и поздравлять, там специально для тебя слово «возможно».

anonymous
()
Ответ на: комментарий от anonymous

Я тебе ответил выше что принципы нужны для того что бы не получалась кучка костылей, а получался нормальный продукт...

Ага. А что ты понимаешь под «нормальным продуктом»?

anonymous
()
Ответ на: комментарий от anonymous

У меня к тебе встречный вопрос, нафига ты споришь с анонимусами на лоре?

Когда я вижу, что в Интернете кто-то неправ, я считаю своим долгом это исправить.

из данной конкретной формы вызова ничего не могу предположить о результате.

О том и речь. Если это не понятно из названий класса и метода, значит это херовые названия.

Мне еще не встерчался язык, в котором его стандартная библиотека была бы бы «интуитивно понятна». Но если она работает логично - всё нормально (а join работает вполне логично и даже удобно).

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Нормальный продукт это у которого WTFs/minute стремится к нулю.

Ок. Тогда иди, покодь на сях пару месяцев. Когда количество WTFs/minute начнёт зашкаливать от переполнений, утечек памяти и прочих радостей рутинной работы, возвращайся, мы с тобой обсудим нужность этого твоего single responsibility principle.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.