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)
Ответ на: комментарий от tp_for_my_bunghole

У каждого народа Европы

Там еще должен где-то быть отрывок про геноцид и рабство..

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

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

А я в полемике упражняюсь.

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

«Интуитивно понятна» - это абсолют. Питон менее понятен чем другие популярные языки, я считаю. Вот почему метод join не согласован со split? Если я пишу ','.join(['a', 'b']), почему не ','.split('a,b')?

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

Все совершают ошибки, но думаю мы слишком далеко отошли от темы данного треда...

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

Видно, плохо вы учили латынь. Люди ничем не отличаются от волков. Те же животные. Люди хищники по природе, и глупо это отрицать. И поступают точно так-же, как хищные животные в природе. Каменные джунгли мало чем отличаются от тропических лесов.

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

Каким боком ты приплел single responsibility principle к си?

Таким, что си - это апогей этого твоего принципа. Выделять память - отдельно, освобождать память - отдельно, что-то делать с памятью - отдельно. От этого основная проблема си.

Принцип - не цель. Он должен продвигать тебя к цели. Там, где ты мне предложил вспомнить о «single responsibility principle», этот принцип не нужен.

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

Не обращайте внимание на маргиналов. Никто никому в Техасе не запрещает преподавать физику. Да и их претензии ко второму закону термодинамике смешны - некоторые креационисты как раз на основе данного закона пытались доказать не корректность теории эволюции. На парней в Топеке не стоит обращать внимания. Там всегда особо твердолобые товарищи жили. Они ещё 100 лет назад умели удивлять журналистов своей твердолобостью.

lucentcode ★★★★★
()
Ответ на: комментарий от Apple-ch

Его никто не десриминирует, и несмотря на это он вечно на что-то жалуется. Он просто неблагодарный тип. Его бы отправить пожить в Африку, или хотя-бы в Китай - он бы потом родному американскому правительству ноги бы целовал(за то, что приняли его обратно).

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

А то не кажется ли тебе стремным получать TypeError в динамически типизированном языке?

В общем, нет. Сообщение «метод xxx не найден» - это тоже type error по сути своей.

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

Это ты не нужен. Памятью в высокоуровневых языках занимается GC, и это не нарушает SRP. Там где применяется C не нужен GC.

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

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

метод xxx не найден

А для этого у меня есть method_missing и миксины (чтобы легко добавлять поведение).

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

А с каких вообще пор фашизм ассоциируется с «Коллективизм и порядок. Полная урбанизация», а не геноцид и рабство.. Ох уж эта подмена понятий..

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

Это ты не нужен. Памятью в высокоуровневых языках занимается GC, и это не нарушает SRP. Там где применяется C не нужен GC.

Split в руби не нарушает srp. Питон не нужен. Ты свободен.

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

Получается ты не используешь сильные стороны.

...из-за того, что не могу использовать __getattr__?

у меня есть много интересных способов сделать программу запутанным клубком

fixed

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

Как раз нарушает. Потому что обязанность split это разбить строку на элементы. Никаких побочных эффектов быть не должно. Если ты не понимаешь зачем нужен принцип единственной обязанности то тебе стоит применять свои навыки в более гуманитарной сфере. Но даже там ты быстро заметишь что чем меньше у рабочего обязанностей, тем выше шанс что он справится со своей работой хорошо. Питон не нужен, так же как и руби. По сути это умирающие языки. Но слава Богу кроме питона есть еще куча языков в которых split не неписан криворукими core developer'ами...

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

Потому что обязанность split это разбить строку на элементы.

Очевидно, что он это делает. Дальше не читал.

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

Я всегда знал что рубисты не от мира сего. Почти во всех распространенных языках split работает очевидным образом. И только в раби сплит работает не пойми как и рубисты с пеной у рта доказываю что это ok.

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

Очевидно что он делает это не правильно. Потому что для строки в которой N разделителей split должен возвращать N+1 элементов.

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

А с каких вообще пор фашизм ассоциируется с «Коллективизм и порядок. Полная урбанизация», а не геноцид и рабство.. Ох уж эта подмена понятий..

Похоже многие понятия не имеют что такое фашизм.

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

Почти во всех распространенных языках split работает очевидным образом.

Ну расскажи нам, в каких распространённых языках split работает очевидным образом, а в каких нет.

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

Очевидно что он делает это не правильно. Потому что для строки в которой N разделителей split должен возвращать N+1 элементов.

Очевидно, что ты упорот и несёшь чушь.

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

Ребятки в очередной раз не догоняют, что благодаря тому, что в строке есть метод «join», ею можно «склеивать» в одну строку любой итератор, и, чтобы равноценно заменить эту возможность пришлось бы создавать некий базовый класс-тип с методом «join», от которого наследовали в обязательном порядке все итераторы, => каждому объекту-итератору пришлось бы таскать с собой этот метод (логично). Тогда как текущая «нелепая» реализация вообще ничего не требует от итераторов, кроме как быть итератором. Вот, что обычно и бывает, когда лезут в чужой монастырь (язык) со своим уставом.

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

Очевидно что ты не хочешь признавать что ты ошибался, поэтому и спускаешься до уровня:

Очевидно, что ты упорот и несёшь чушь.

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

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

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

Это зачитывай как свою неспособность к какой либо аналитической деятельности.

Слив засчитан. Теперь уходи. На досуге посмотришь, как split реализован например в жабе.

anonymous
()
Ответ на: комментарий от special-k
Python 2.7.2+ (default, Oct  4 2011, 20:03:08) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo():
...     def __iter__(self):
...         for i in range(3):
...             yield str(i)
... 
>>> 'a'.join(Foo())
'0a1a2'
>>> 

например

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

Я бы на Java не ровнялся. Вряд ли Java можно назвать примером хорошего годного языка. Это лишь доказывает что split в ruby кривой.

Слив засчитан.

Сливайся сколько тебе угодно.

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

Я бы на Java не ровнялся. Вряд ли Java можно назвать примером хорошего годного языка. Это лишь доказывает что split в ruby кривой.

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

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

Потому что по-английски так будет правильно читать. Ты, конечно, сейчас возопишь «а пачему join-то, join неправильный тогда»? А потому что есть конкретные практические соображения, на которые я выше указал. И не надо передергивать.

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

Ты, конечно, сейчас возопишь «а пачему join-то, join неправильный тогда»?

Да ну, я просто скажу, что оно где-то через жопу было сделано, раз получилось такое несоответствие.

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

У вас там как, наследование совсем не практикуется? Так как это единтсвенный возможный вариант, при котором твои практические соображения не были бы высосаны из пальца, я считаю.

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

Ну и показывает уровень понимания автором юникода, но это уже побочный эффект.

Особенно интересной ситуация становится, если вспомнить национальность создателя Ruby. :-)

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

каждому объекту-итератору пришлось бы таскать с собой этот метод

__iter__

Я выше предложил метод __join__ добавить в объект, а тут __iter__ вместо него. Т.е. все равно поведение объекта определено внутри объекта. И вы вызываете метод, который вызывает метод, чтобы получить результат (а этот метод еще и итератор, епт, тогда как текст можно было бы кешировать, например, хотя речь и не об этом)).

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

Объясняю еще раз, на пальцах: В Пайтоне любой объект, способный быть итератором (по факту он должен иметь метод __iter__), который будет выдавать строки при каждой итерации, может быть склеен при помощи

''.join(<object>)
Сюда включаются не только списки, но и кортежи, строки, объекты пользовательских классов (пример я дал выше по треду) и даже функции-генераторы (вернее, итераторы, которые они порождают при вызове).

Вопрос: каким еще образом можно добиться того же при таких же нулевых затратах? Ах, да. Наверное, надо былов каждом классе из перечисленных сделать метод «join». Читалось бы здорово, а получившийся оверхед это чушня.

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

национальность создателя Ruby

Не знаю, что используют японцы, но вроде, в таких языках не любят юникод, т.к. символы занимают уже по 3 байта. И upcase там не применим, так что, тут наоборот все закономерно.

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

Это параноидальное представление о превосходстве собственной рассы, которое докатывается до всякого непотребства. А то о чем ты говорил - социализм.

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

Я выше предложил метод __join__ добавить в объект, а тут _iter__ вместо него.

Твоя проблема в том, что ты не понимаешь культуру программирования и специфику идей, заложенных в Пайтон. Разница между твоим предложением и тем, что есть, в том, что __iter__ — куда большее, чем просто хук для реализации «склеивания» итераторов в строки. Он основа протокола итераторов в Пайтоне, а это конкретное применение всего лишь побочный приятный бонус. В Пайтоне хватает таких практичных решений. Еще раз упираю на то, что это решение практичное, никакого введения лишних сущностей, бритва Оккама же, епт.

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

Объясняю еще раз, на пальцах

Не надо, я уже понял, зачем там накрутили этот ужас.

Вопрос: каким еще образом можно добиться того же при таких же нулевых затратах?

Встречный вопрос: какое слово в предложении «У вас там как, наследование совсем не практикуется?» ускользнуло от твоего понимания?

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

Обычная утиная типизация

никакого введения лишних сущностей

Да, что-то такое есть, достигается путем лишних телодвижений (типа создать генератор). Это логично, ведь в языке нет миксинов, значит все будет впихиваться в эти нелишние сущности, иногда со скрипом, иногда с разбега, через __разные__ методы.

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

Это параноидальное представление о превосходстве собственной рассы, которое докатывается до всякого непотребства. А то о чем ты говорил - социализм.

Гитлер возглавлял национал-социалистическую немецкую рабочую партию, и всегда говорил только о социализме. Никогда даже не использовали слово фашизм, его наверное не было в обиходе.

Расовые теории добавили потом, как дополнение.

В СССР при социализме депортировались целые малые народы, огромное количество населения в трудовых лагерях под надуманными предлогами, во имя какой-то цели.

Если такие же познания о языках программирования, то о чём спорить... Здесь ликбез проводить надо.

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

Встречный вопрос: какое слово в предложении «У вас там как, наследование совсем не практикуется?» ускользнуло от твоего понимания?

Наследование в любом объектно-ориентированном ЯП практикуется, в том числе и в питоне.

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

у меня есть много интересных способов сделать программу запутанным клубком

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

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

Наследование в любом объектно-ориентированном ЯП практикуется, в том числе и в питоне.

И что помешало сделать какую нибудь абстрактную iterable с методом join и наследовать всё от неё, а не городить этот ужас?

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

Расовые теории

Нам он как бы известен благодаря им, остальное втрично.

депортировались

Может переселялись? Ну и что.. из них же не делали рабов, их же не истребляли.

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

Я не понял, что ты исправлял, потому что это какой-то бессвязный поток мыслей :). Миксинов действительно нет, но, как ни странно, всё идёт без скрипа. А __разные__ методы как раз хорошо скрыты от повседневного использования.

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