>Тест аналогичного куска на Perl/Python/PHP в студию!
Скорость сравнить? Я исходники дал, можете попробовать. Эта статья подразумевалась не как бенчмарк, а как описание методики.
>Perl тоже умеет использовать Си
Да, эта библиотека(RubyInline) как раз из мира Perl пришла, о чем на ее сайте и сказано.
Собрал себе V8. Там есть возможность читать с stdin?
Аргументы скрипту тоже не передаются, хотя в их багтреккере есть исью что должен быть массив arguments.
У меня почему-то ругается…
В мозиловском SpiderMonkey и readline и arguments есть. Здесь нетак?
С юникодом тоже просто. Если поставить пакет unicodechars gem install unicodechars
А потом в коде: require 'rubygems'
require 'unicodechars'
"фыва".chars[0] #=>"ф"
Да, только не сделать массив, а работать как с массивом.
Например: "string"[1..2] #=> "tr"
"string"[4..-1] #=> "ng"
"string"[-2..-1] #=> "ng"
но это возвратит код символа! "string"[0]#=>115
чтобы получить один символ — например так: "string"[0..0]#=>"s"
Хотя при желании можно и массив сделать: "string".split('')#=> ["s", "t", "r", "i", "n", "g"]
А также операторы сравнения == и <=> работают и для массивов.
Кстати, у вас в примере немного не правильно, %w{1 2 3 4} — это массив строк, а не чисел.
nil это объект-синглтон(т.е. единственный) класса NilClass. Присваевается переменным, не имеющим значения.
Пример из статьи: a = Array.new(3) # [nil, nil, nil] — массив пустой, значит все элементы равны nil.
В условиях приравнивается к false a = nil
puts "nil!" unless a # напечатает nil!
У каждого объекта есть метод проверки на nil. puts "nil!" if a.nil? # опять напечатает nil!
Есть еще такой хитрый прием: a ||= "sting"#присвоит переменной a значение "string" только если a=nil или a=false
a &&= "sting"#наоборот, присвоит только если a!=nil и a!=false
Во-первых, в ветке Ruby 1.8 компилляции в байткод нет, только в 1.9.
Во-вторых, не в компиляции дело.
Ruby — это динамический язык, в динамических языках нет оверлоадинга.
И по скорости динамические языки всегда медленнее статических.
Если для ваших задач критична скорость — используйте тот же C#:)
В эппл еще как думают. Простому юзеру в Мак Ос уже не надо знать что такое рут и вообще терминал открывать.:)
А «поставить библиотеку для языка программирования» — это задача уже чуть более продвинутая, чем для простого юзера.
>That means you'll get an exception at runtime if you try to write invalid xhtml
Да, это и подразумевалось:) Спасибо, сейчас исправлю.
>что же дальше делать с этим comp…
В результате у нас получился простой язык для создания описаний. Ему можно придумать массу применений. Ну например, дописав пару методов к классу Computer мы можем, экспортировать эти описания в различные форматы.
class Computer
def to_html; end
def to_pdf; end
def to_xls; end
end
А потом оформить это как небольшую консольную утилиту. Пользователь может сделать описание и экспортировать в различные форматы conf2html my_comp.conf my_comp.html
Потом это описание в подпись на форум поставить или еще куда.
Но это просто синтетический пример для демонстрации. А вобще, DSL очень широко распространены в Ruby библиотеках. Например, тот же Rake это DSL, или как я упоминал в статье в Rails используется DSL, и тд.
То, что мы уходим от валидности, делает наш DSL более близким к человеческому языку и он уже становиться BNL'ом(Business Natural Language).
Тут я просто показал как можно просто перейти от DSL к BNL.
Но BNL не всегда так удобен, как DSL(особенно для программистов).
Так что «вкусности Ruby» для DSL все-таки вкусности:)
В топике — 1000 раз в цикле.
Скорость сравнить? Я исходники дал, можете попробовать. Эта статья подразумевалась не как бенчмарк, а как описание методики.
>Perl тоже умеет использовать Си
Да, эта библиотека(RubyInline) как раз из мира Perl пришла, о чем на ее сайте и сказано.
Даа, Erlang — это сила!:)
Аргументы скрипту тоже не передаются, хотя в их багтреккере есть исью что должен быть массив arguments.
У меня почему-то ругается…
В мозиловском SpiderMonkey и readline и arguments есть. Здесь нетак?
gem install unicodechars
А потом в коде:
require 'rubygems'
require 'unicodechars'
"фыва".chars[0] #=>"ф"
Например:
"string"[1..2] #=> "tr"
"string"[4..-1] #=> "ng"
"string"[-2..-1] #=> "ng"
но это возвратит код символа!
"string"[0]#=>115
чтобы получить один символ — например так:
"string"[0..0]#=>"s"
Хотя при желании можно и массив сделать:
"string".split('')#=> ["s", "t", "r", "i", "n", "g"]
a = [1,2]
a*2# [1,2,1,2]
А также операторы сравнения
==
и<=>
работают и для массивов.Кстати, у вас в примере немного не правильно,
%w{1 2 3 4}
— это массив строк, а не чисел.Пример из статьи:
a = Array.new(3) # [nil, nil, nil]
— массив пустой, значит все элементы равны nil.В условиях приравнивается к false
a = nil
puts "nil!" unless a # напечатает nil!
У каждого объекта есть метод проверки на nil.
puts "nil!" if a.nil? # опять напечатает nil!
Есть еще такой хитрый прием:
a ||= "sting"#присвоит переменной a значение "string" только если a=nil или a=false
a &&= "sting"#наоборот, присвоит только если a!=nil и a!=false
Зато вся юниксойдность там хорошо запрятана за пользовательский интерфейс.
Во-вторых, не в компиляции дело.
Ruby — это динамический язык, в динамических языках нет оверлоадинга.
И по скорости динамические языки всегда медленнее статических.
Если для ваших задач критична скорость — используйте тот же C#:)
А «поставить библиотеку для языка программирования» — это задача уже чуть более продвинутая, чем для простого юзера.
Хотите два конструктора — используйте переменное число параметров.
Такой же код для перегрузки методов.
Да, это и подразумевалось:) Спасибо, сейчас исправлю.
>что же дальше делать с этим comp…
В результате у нас получился простой язык для создания описаний. Ему можно придумать массу применений. Ну например, дописав пару методов к классу Computer мы можем, экспортировать эти описания в различные форматы.
А потом оформить это как небольшую консольную утилиту. Пользователь может сделать описание и экспортировать в различные форматы
conf2html my_comp.conf my_comp.html
Потом это описание в подпись на форум поставить или еще куда.
Но это просто синтетический пример для демонстрации. А вобще, DSL очень широко распространены в Ruby библиотеках. Например, тот же Rake это DSL, или как я упоминал в статье в Rails используется DSL, и тд.
Тут я просто показал как можно просто перейти от DSL к BNL.
Но BNL не всегда так удобен, как DSL(особенно для программистов).
Так что «вкусности Ruby» для DSL все-таки вкусности:)
attr :asdf, true #тоже что и attr_accessor :asdf
attr :asdf, false #тожу что и attr_reader :asdf