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

программист на Ruby

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

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

Нечего возразить по делу - доебись до словосочетаний.

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

Нечего возразить по делу

Я не возражаю против твоего баттхерта %)

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

Нечего возразить по делу - запостил глупый вопрос с оскорблением.

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

«недостатки дизайна» Ruby как всегда обсуждают читатели хабростатией про «странности» языков программирования.

В целом, могу предположить, что руби не принимают те, кто не принимает объектного программирования. Мне сложно понять как такое возможно, но, тем временем я сам в упор не вижу функциональное программирование, например.

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

«недостатки дизайна» Ruby обсуждают те кто видит эти недостатки, а не слепые фанбои. Ruby отличный язык для «смотри как я могу выпендрится» джемов. Инструмент серьезной командной разработки из Ruby никакой...

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

Инструмент серьезной командной разработки

Это: система контроля версий, багтрекер, менеджер проектов, автоматизированная сборка и тестирование (и IDE).

А ты говоришь не зная о чем (абсолютно).

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

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

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

Для тебя все эти вещи бесполезны в командной разработке, потому что у тебя нет главных инструментов разработчика: мозга и языка программирования.

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

FIXED

А недостатки руби, в первую очередь, связаны с тем что идиоматический код на руби это трудноотлаживаемая лапша из DSL'ей. И вряд ли ты знаешь что с этим делать.

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

А ты говоришь не зная о чем (абсолютно).

Менеджер проектов — лицо, занимающееся вопросами поиска заказчиков проектов и исполнителей (отношения: подрядчик - субподрядчик).

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

охфейспалммойфейспалм... Redmine is a free and open source, web-based project management and bug-tracking tool.

anonymous
()
Ответ на: FIXED от anonymous

код на руби это трудноотлаживаемая лапша из DSL'ей

а в питоне мерзкие отступы

И вряд ли ты знаешь что с этим делать.

О, поверь, я знаю что с этим делать;)

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

а в питоне мерзкие отступы

Это не мешает писать понятный код, в отличие от лапши из DSL'ей.

О, поверь, я знаю что с этим делать;)

Ты даже руби толком не знаешь, тебя 100500 раз на этом ловили...

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

В СoffeeScript кстати тоже мерзкие отступы которые не мешают рельсовикам его во всю юзать...

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

И в чём проблема?

Как раз таки в Ruby проблема «каждому итератору пришлось бы таскать этот метод» решается очень элегантно: когда создаешь итератор (т.е. нечто, имеющее метод `each`), ты инклудишь модуль Enumerable (`include Enumerable`).

Т.е. по сути, так как ты и сказал: все «наследуются» от модуля Enumerable. Однако в Ruby подобное «наследование» сделано настолько элегантно и органично, что его никто не боится (в отличии от Python, где расширение цепочки наследования с помощью классов-миксинов уже начинает пахнуть шаманством).

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

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

А еще производительность интерпретатора сильно влияет на полезность отступов ах-ах))

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

FIXED

Одна беда у руби - питонщеги которые знают руби лучше чем рубисты:) Хотя.. это не беда.. это забавно:)

anonymous
()
Ответ на: FIXED от anonymous

Это очень мило, что вы выучили руби, чтобы писать в трэдах про руби:) Что, новости про питон не частят, а когда-таки выходят, то у 2.5 петонщегов диалог не получается?) Оно там хоть живо еще?)

special-k ★★★★
()
Последнее исправление: special-k (всего исправлений: 2)
Ответ на: И в чём проблема? от funny_falcon

Он про это говорил

2.1.0 :010 > class MyClass
2.1.0 :011?>   include Enumerable
2.1.0 :012?>   def each(&block)
2.1.0 :013?>       %w(a b).each(&block)
2.1.0 :014?>   end
2.1.0 :015?> end
 => :each 
2.1.0 :016 > MyClass.new.each { |v| puts v }
a
b
 => ["a", "b"] 
2.1.0 :017 > MyClass.new.join('-')
NoMethodError: undefined method `join' for #<MyClass:0x0000000303a5b8>
	from (irb):18
	from /home/victor/.rvm/rubies/ruby-2.1.0/bin/irb:11:in `<main>'

In [10]: class MyClass:
    def __iter__(self):
        return iter(('a', 'b'))
   ....:     

In [11]: for x in MyClass():
    print(x)
   ....:     
a
b

In [12]: '-'.join(MyClass())
Out[12]: 'a-b'
anonymous
()
Ответ на: комментарий от anonymous

ты прав

да :) я уже потом осознал, что метод join есть только у Array (в принципе, он мало где ещё нужен. Даже в питоне ".join([str(v) for v in x]) работает быстрее, чем ".join(str(v) for v in x) )

Но это можно поправить:

module Enumerable
  def join(sep = '')
    res = ''
    each{|v| res << sep unless res.empty? ; res << v.to_s }
    res
  end
end
funny_falcon
()
Ответ на: ты прав от funny_falcon

Для кого monkey patch это норм те выбирают руби. Для кого не норм те выбирают python. Вот и вся разница :)

anonymous
()
Ответ на: комментарий от anonymous
module Joinable
  include Enumerable
  def join separator=nil
    to_a.join separator
  end
end
special-k ★★★★
()
Ответ на: комментарий от anonymous

ты удивительно годный анонимус, лучи добра тебе

а сейчас я пойду проблююсь от увиденного руби-кода; не могу понять, как можно предъявлять претензии к двойным подчеркиваниям (которые трогать, по-хорошему, приходится не так уж часто), когда идиоматичный руби-код пестрит %#$

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

И что же хорошего в этом историческом недоразумении?(http://stackoverflow.com/questions/493819/python-join-why-is-it-string-joinli...):

Historical note. When I first learned Python, I expected join to be a method of a list, which would take the delimiter as an argument. Lots of people feel the same way, and there’s a story behind the join method. Prior to Python 1.6, strings didn’t have all these useful methods. There was a separate string module which contained all the string functions; each function took a string as its first argument. The functions were deemed important enough to put onto the strings themselves, which made sense for functions like lower, upper, and split. But many hard-core Python programmers objected to the new join method, arguing that it should be a method of the list instead, or that it shouldn’t move at all but simply stay a part of the old string module (which still has lots of useful stuff in it). I use the new join method exclusively, but you will see code written either way, and if it really bothers you, you can use the old string.join function instead.

И что произойдет, если вы передатите этому методу коллекцию не строк? Например,

"-".join([1,2,3])
Произойдет
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, int found

В Enumerable не зря нет #join. Он там не нужен — не всякая коллекция обязана поддерживать конкатенацию элементов; и не все элементы обязаны поддерживать конвертирование в строки. Здесь Ruby заблаговременно избавляет вас от того, чтобы вызвать метод для типа данных, который его не поддерживает.

Поэтому в Ruby сперва нужно конвертировать в Array:

MyClass.new.to_a.join '-' #=> "a-b"

Конвертирование в другой тип данных не обязательно должно быть явным. Например, в Ruby как строку мы можем использовать Integer:

[1,2,3].join '-' #=> "1-2-3"

Или любой другой объект:

class MyClass
  include Enumerable 

  def each &b
    %w!
      a
      b
    !.each &b
  end

  def to_s
    to_a.join
  end
end

[MyClass.new, MyClass.new, MyClass.new].join '-' #=> "ab-ab-ab"

Python — не самый плохой язык, в нем есть приятные моменты(мне определенно нравится форматирование отступами, к примеру), но многое в нем неконсистентно так же, как и этот ваш str.join(iterable). Думаю, во многом это обусловлено использованием множественного наследования вместо миксинов. Это фундаментальный недостаток.

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

Ruby — не самый плохой язык, в нем есть приятные моменты, но многое в нем неконсистентно так же, как и этот ваш [1, 2, 3][3..3]. Думаю, во многом это обусловлено поощрением манки патчинга. Это фундаментальный недостаток.

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

а в питоне мерзкие отступы

Оо. Отступы вообще не проблема. Гвидобейсик примечателен более фундаментальными, настоящими факапами.

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

Потому что это бред, так же как и self в параметрах.

self, кстати, показателен. Эта такая уродская фишка относящаяся к «явное лучче, чем неявное». Показательность заключается в том, что к неявной передаче методам ссылки на объект привыкли все, а гвидо это просто проигнорировал, сделал вид, будто он лучше знает как надо. Вся суть.

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

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

В Ruby Array это именно массив строк? Избавлять заблаговременно от неправильной операции это только гарантирование типа массива строк, но в обсуждаемых языках таких типов нет, т.к. все массивы/контейнеры гетерогенны.

Т.е. гарантировать заблаговременно корректность join() на уровне ЯП с динамической типизацией невозможно.

Но можно гарантировать хотя бы в рантайме. И питон это делает, как видишь из своего же примера. А Ruby этого _не_ делает, вместо проверки типа производит неявное преобразование к строке.

В Enumerable не зря нет #join. Он там не нужен — не всякая коллекция обязана поддерживать конкатенацию элементов; и не все элементы обязаны поддерживать конвертирование в строки.

Здесь кроется вся причина непонимания сути вопроса людей, которые сичтают, что join() должен быть у списка.

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

Конкатенация это только свойство строк. Склеиваются строки, а не контейнер. Контейнер только лишь источник строк. В Py эту ситуацию обработали достаточно корректно, операция join() берёт на вход итератор за которым может быть не только массив и не только контейнер.

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

Их не существует.

На самом деле, например когда я, в свое время, был на девконфе, группа питонщегов была одной из самых малочисленных, а группа рубистов плотно занимала (пусть и небольшую) комнату.

Думаю, дело в том, что питон - язык без специализации. Хотя тут и набигают клоуны, с троллингом на тему руби=раилз, но ведь для руби это безусловный плюс, потому что web разработка => rails => ruby. А что должно произойти, чтобы человек, не программировавший на питоне раньше, вдруг начал на нем программировать?

Это закономерно, т.к. руби лучше питона.

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

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

О, а голимая строка знает об объектах входящих в контейнер все, лол.

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