LINUX.ORG.RU

Ruby 2.0.0 preview1

 


2

6

Анонсирован Ruby 2.0.0 preview1. Были включены новые фишки, которые делают разработку на Ruby ещё приятнее.

Анонсированные фичи:

  • Уточнения (Refinements) [1]
  • Именованные аргументы в методах (сахар над хэшем) [2]
  • Enumerator#lazy [3]
  • Module#prepend [4]
  • #to_h
  • %i, для массивов символов
  • Движок регулярных выражений изменён на Onigmo [5]
  • Поддержка DTrace [6] (не включено)

Пока что ещё не все новые фишки включены в Ruby, это откладывается на следующие анонсы.

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

Все программы, которые написаны на ruby-1.9 будут работать на ruby 2.0, если в них не будет особой магии.

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

anonymous

Проверено: tazhate ()
Последнее исправление: tazhate (всего исправлений: 2)

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

В целом вы правы но не защет закорючек а защет dsl, ох dsl палка о двух концах.

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

А шо, в руби таки уже есть JIT? Из коробки? Ой не звезди.

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

У Питона также лучше с построением ГУИ, хотя мне это было не принципиально.

Уж на что питон люблю, но согласиться с тем, что там с гуи хоть сколько-нибудь хорошо, не могу. TkInter - устаревшее гогно (сооруди-ка мне самый распространенный grid - в коробке нету, сниппеты как один все нерабочие), PyGTK - мазохизм, в котором тебя заставляют писать C на питоне, PyQt/PySide - такой же мазохизм, когда тебя заставляют писать С++ на питоне. То есть тулкиты тащат все вредные привычки своих языков в питон, где таковые неестественны и нежелательны, а потом удивляются, что все программы выглядят, будто написаны через пень-колоду, и работают точно так же.

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

Это както не серьезно там руби с заданиями для школьников там даже оформление соотвецтвующее, вот это норм http://repl.it/
а вообще можно на codeschool сходить и поучится там есть бесплатные курсы.

st4l1k ★★
()
Ответ на: .... от anonymous

Терпеть не можешь двоеточия и перешёл на Ruby? Там же на каждом шагу ':'.

irb(main):003:0> params = { id: 1, 'id' => 2 }
{:id=>1, "id"=>2}

irb(main):004:0> params[:id]
1

irb(main):005:0> params['id']
2

Кто не понял :id это ruby symbol который как строка только символ.

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

Проблемы со скоростью решаемы за счет кеширования байт-кода.

О каком кешировании ruby байт-кода ты говоришь? Нет такого в рубях.

anonymous
()
Ответ на: комментарий от anonymous
irb(main):003:0> params = { 'id'.to_sym => 1, 'id' => 2 }
{:id=>1, "id"=>2}

irb(main):004:0> params['id'.to_sym]
1

irb(main):005:0> params['id']
2

Извращение но возможно

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

ИМХО, политика чистой воды.

где ты там политику то увидел? В этом посте так и говорят: фронтенду фронтендово(js) - бекенду бекендово (языки jvm), а со времен младенчества завалявшийся между ними Ruby можно на помойку отправлять за ненужностью. Избавились от лишней сушности, и всего то.

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

А как же проекты 37сигналов? Уж давай тогда все сайты на рельсах перечислим, что мелочится.

на руби написаны guthub

Рельсы? Ну, не может быть.

twitter (изначально, но политическим соображениям перешел на другую платформу)

Конечно по политическим, какие еще причины могут быть. А эти эпичные тормоза рельсов придумали питонщики от зависти. Про то, что проект функциональности твиттера можно накодить на шеллскрипте тактично промолчим.

redmine
А вы что скажете, calibre?

Я могу сказать Trac, но боюсь ты не в силах будешь осилить всю глубину этого сравнения.

Может все же покажешь хоть одну вменяймую гуевую программу на руби, хотя бы уровня deluge? Я бы и про консольные спросил, но боюсь вы по 13му кругу пойдете про свои капистраны, паппиты и метасполиты.

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

а что паппеты? configuration management, кстати, очень симптоматичная сфера применения руби и практически полного отсутствия питона (да, я знаю о bcfg2, о его активной разработке и богатом функционале). или дело в том, что все, кто мог подобное написать, ушли в ruby, или в том, что на том же питоне такие вещи писать почему-то проблематичнее.

с gui всё по-другому. для большинства таких задач разница python/ruby не является принципиальной, но на стороне питона есть застолблённое место в этой сфере. добавим к этому, что большинство этих программ было написано до ruby hype.

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

А эти эпичные тормоза рельсов

Я вообще это только от тебя сейчас услышал.

Я могу сказать Trac, но боюсь ты не в силах будешь осилить всю глубину этого сравнения.

Это точно, оставь себе)

программу уровня deluge

Зачем.. давай лучше ты, программу уровня autocad, ms office, или.. на худой конец openoffice, или может сойдемся на том, что обе платформы слабо зарекомендовали себя для настольного ПО. Правда я не знаю на сколько производительность питона выросла с версии 2.0 (если не сильно, то непонятно, что мешало писать ПО 12 лет).

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

Зачем.. от этого у питонщиков нормальное управление библиотеками появится? Я могу конечно.. мне не жалко..

special-k ★★★
()

Они там совсем упоролись

Уточнения (Refinements) http://timelessrepo.com/refinements-in-ruby

module TimeExtensions
  refine Fixnum do
    def minutes; self * 60; end
  end
end

class MyApp
  using TimeExtensions

  def initialize
    p 2.minutes
  end
end

MyApp.new    # => 120
p 2.minutes  # => NoMethodError

Теперь любой класс (в данном примере Fixnum) будет разным в зависимости от того где я его использую.
-5 к пониманию исходников.

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

ты про c код языка, или про сам язык?

Да, я про c код языка

И есть моменты в Ruby, которые меня бесят :)

К примеру?

Тривиальный пример: @@var - семантика этого чуда взрывает мозг.

Чуть более «приземлённый»: почему только блок может быть «блока», а не любая хрень с методом call ? Опять таки, корни этого в реализации - в C коде.

Более продвинутый: семантика блока, который «захватывает» даже те переменные, на которые он явным образом не ссылается. - и опять-таки, это наследие версий до 1.9, в которых сделать именно так было проще, но сейчас оно нафиг не нужно.

Самый мозговзрывной для меня момент: зачем Hash сделали по умолчанию упорядоченным в 1.9 вместо того, чтобы для страждущих ввести новый класс OrderedHash??? Изменения сделали в базовой структуре «хэша», которая, кроме собственно класса Hash, используется практически везде, и, соответственно, замедление этой структуры сказывается на производительности всего интерпретатора.

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

Ну так.. куда более сложный гитхаб работает и не жалуется, попутно делясь красивыми архитектурными решениями, а с jvm слышно только нытье о том как трудно писать на scala.

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

Вот и мне интересно, что было бы, если 37сигналов в опеределенный момент не запилили рельсы - этим языком так и пользовались бы 3,5 азиата.

Тот факт, что самый влиятельный в Веб фреймворк (и, на пару с Django, один из самых продвинутых) вдруг оказался написанным на Ruby, что-то говорит положительное об этом языке.

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

куда более сложный гитхаб работает и не жалуется

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

а с jvm слышно только нытье о том как трудно писать на scala.

Ну по сравнению с руби да, наверное. А так достаточно приятный и простой язык.

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

Чем тебе pip не нравится?
http://stackoverflow.com/questions/8726207/what-is-softwares-in-python-which-...

Если нужны разные пакеты для dev и prod то сделай два файла requirements.dev.txt и requirements.prod.txt)

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

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

ИМХО, политика чистой воды. Платформа руби становится влиятельной, коммерческая java начинает нервничать. ИМХО не зря..

У меня такое ощущение, что у вас по всей квартире развешаны иконы разработчиков ruby и вы каждое утро им молитесь. Ощущение что разговариваю с религиозным фанатиком.

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

Если нужны разные пакеты для dev и prod то сделай два файла requirements.dev.txt и requirements.prod.txt

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

Я как-то поставил джем rails второй и третей версии в одном окружении, не работали ни вторые, ни третьи рельсы)

Это печально.

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

Годно, но это альтернатива puppet но тоже отлично.

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

Ощущение у вас.. как говорят на одном сайте, в нижней части спины))

Да нет, мне, пишущему в основном на scala, эти прения фанатов языков для прототипирования как-то боком =)

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

Я как-то поставил джем rails второй и третей версии в одном окружении, не работали ни вторые, ни третьи рельсы)

Ну, это всё-таки редкое исключение, кардинальное изменение архитектуры целого фреймворка. При этом, заметьте, bundler спокойно разруливает, если в окружении для вторых рельс случайно затесался activesupport из третьих.

Основное удобство bundler выявилось при подготовке rpm для centos:

bundle install --deployment --bin-stubs ставит все зависимости «сюда же» в папку приложения, и спокойно упаковывается в одну rpm.

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

Когда потребовалось одно приложение перевести на python (к сожалению, PIL оказался вне конкуренции), парню - питонщику пришлось часика два-три покумекать над правильным построением и последующей упаковкой virtualenv. Впрочем, он справился.

Ещё один плюс в поддержку Python (напоминаю, что я рубист): именно из-за внутренней организации С-го кода рубей её гуишные библиотеки не развились (и не надо вспоминать Shoes - попытка была на отлично, но загнулась с уходом _why ), - решения, позволяющие «легко» писать расширения для ruby, мешают писать большие и тяжёлые биндинги к монструозным библиотекам.

Плюс в пользу Ruby: JRuby. Что с Jython? А JRuby живёт и великолепно развивается. <режим-троля-предсказателя> Через пару лет он станет превалирующей платформой для Ruby </режим-троля-предсказателя>

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

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

Блин это для безопасного манки патчинга, у которого есть как свои плюсы так и минусы.

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

Поживем - увидим. Maglev позволяет передавать объекты между приложениями. Вычисления получаются.. довольно параллельными и даже распределенными априори.

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

А JRuby живёт и великолепно развивается. <режим-троля-предсказателя> Через пару лет он станет превалирующей платформой для Ruby </режим-троля-предсказателя>

Скорее всего вы правы, Jruby отлично развивается.

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

Ощущение у вас.. как говорят на одном сайте, в нижней части спины))

Нечего ответить? Скажи, что у него баттхерд! И да, этим высказыванием ты выдал в себе луркоеба. Пиши еще!
З.Ы. Отметая все факты, оставаться правым, не слышать то, что говорят другие люди. Забавная у тебя жизнь. Сочувствую.

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

Вот еще странность.

Делаем два ключа.

irb(main):001:0> str_key = 'str key'
"str key"
irb(main):002:0> ar_key = [:ar, :key]
[:ar, :key]
Прошу заметить что это мутабельные объекты.

Делаем хеш с созданными ключами

irb(main):003:0> hash = {}
{}
irb(main):004:0> hash[str_key] = :v1
:v1
irb(main):005:0> hash[ar_key] = :v2
:v2

Теперь меняем объекты ключи

irb(main):006:0> str_key[0..2] = 'STR'
"STR"
irb(main):007:0> str_key
"STR key"
irb(main):008:0> ar_key[0] = :AR
:AR
irb(main):009:0> ar_key
[:AR, :key]

Пробуем достучатся к значениям с помощью измененных ключей

irb(main):010:0> hash[str_key]
nil
irb(main):011:0> hash[ar_key]
nil
Все логично. Мы получили nil потому что в hash хранятся старые хеши для объектов ключей.

Пересчитаем хеши для объектов ключей и попробуем получить значения.

irb(main):012:0> hash.rehash
{"str key"=>:v1, [:AR, :key]=>:v2}
irb(main):013:0> hash[str_key]
nil
irb(main):014:0> hash[ar_key]
:v2
WTF? почему для строки получили nil по новому значению ключа?

:v1 можно получить по старому значению ключа
irb(main):015:0> hash['str key']
:v1

Т.е. у нас все объект. Все однообразно. Но вставка строкового ключа в хеш это особый случай. Вот код функции для добавления значения в хеш.
[6] pry(main)> show-method Hash#[]=

From: hash.c (C Method):
Number of lines: 13
Owner: Hash
Visibility: public

VALUE
rb_hash_aset(VALUE hash, VALUE key, VALUE val)
{
    rb_hash_modify(hash);
    hash_update(hash, key);
    if (RHASH(hash)->ntbl->type == &identhash || rb_obj_class(key) != rb_cString) {
    st_insert(RHASH(hash)->ntbl, key, val);
    }
    else {
    st_insert2(RHASH(hash)->ntbl, key, val, rb_str_new4);
    }
    return val;
}

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

Какие еще факты?

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

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

потому что

2.0.0dev :004 > class A
2.0.0dev :005?>   end
 => nil 
2.0.0dev :006 > h = { A.new => 1, A.new => 2 }
 => {#<A:0x00000000c85500>=>1, #<A:0x00000000c854d8>=>2} 
2.0.0dev :008 > h[A.new]
 => nil 
2.0.0dev :009 > 'a'.object_id
 => 6544700 
2.0.0dev :010 > 
2.0.0dev :011 > 'a'.object_id
 => 6533940 

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

а я знал, что ты знал.

Ну еще бы. Ты ведь всегда прав и всё знаешь? Школоло такое школоло.

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

Особенность не в

irb(main):010:0> hash[str_key]
nil
irb(main):011:0> hash[ar_key]
nil
а в
irb(main):012:0> hash.rehash
{"str key"=>:v1, [:AR, :key]=>:v2}
irb(main):013:0> hash[str_key]
nil
irb(main):014:0> hash[ar_key]
:v2

При вставке строкового ключа, строка куда-то копируется и потом хеш сумма копии используется для доступа:
irb(main):001:0> str_key = 'str_key'
"str_key"

irb(main):002:0> ar_key = [:ar, :key]
[:ar, :key]

irb(main):003:0> h = { str_key => :v1, ar_key => :v2 }
{"str_key"=>:v1, [:ar, :key]=>:v2}

irb(main):004:0> key_ids = h.keys.map(&:object_id)
[16263520, 16285280]

irb(main):005:0> key_ids.include? str_key.object_id
false # !!! у ключа другой object_id

irb(main):006:0> key_ids.include? ar_key.object_id
true # !!! у ключа тот же object_id 

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