Ruby'nin "mevcut" sürümü (1.8) ile "yeni" sürüm (1.9) arasındaki farklar konusunda net değilim. Farklılıkların "kolay" veya "basit" bir açıklaması var mı ve neden bu kadar farklı?
Ruby'nin "mevcut" sürümü (1.8) ile "yeni" sürüm (1.9) arasındaki farklar konusunda net değilim. Farklılıkların "kolay" veya "basit" bir açıklaması var mı ve neden bu kadar farklı?
Yanıtlar:
Sam Ruby'nin farklılıkları özetleyen harika bir slayt gösterisi var .
Bu bilgiyi daha kolay referans için satır içine getirmek amacıyla ve bağlantının soyut gelecekte kesilmesi durumunda, burada Sam'in slaytlarına genel bir bakış. Slayt gösterisinin incelenmesi daha az zorlayıcıdır, ancak hepsinin böyle bir listede yer alması da yararlıdır.
Yakut 1.9
irb(main):001:0> ?c
=> "c"
Yakut 1.8.6
irb(main):001:0> ?c
=> 99
Yakut 1.9
irb(main):001:0> "cat"[1]
=> "a"
Yakut 1.8.6
irb(main):001:0> "cat"[1]
=> 97
Yakut 1.9
irb(main):002:0> {1,2}
SyntaxError: (irb):2: syntax error, unexpected ',', expecting tASSOC
Yakut 1.8.6
irb(main):001:0> {1,2}
=> {1=>2}
İşlem: {1 => 2} biçimine dönüştür
Array.to_s
Şimdi Noktalama İşaretleri İçeriyorYakut 1.9
irb(main):001:0> [1,2,3].to_s
=> "[1, 2, 3]"
Yakut 1.8.6
irb(main):001:0> [1,2,3].to_s
=> "123"
Eylem: Bunun yerine .join kullanın
Yakut 1.9
irb(main):001:0> case 'a'; when /\w/: puts 'word'; end
SyntaxError: (irb):1: syntax error, unexpected ':',
expecting keyword_then or ',' or ';' or '\n'
Yakut 1.8.6
irb(main):001:0> case 'a'; when /\w/: puts 'word'; end
word
İşlem: Noktalı virgül, sonra veya yeni satır kullanın
Yakut 1.9
irb(main):001:0> i=0; [1,2,3].each {|i|}; i
=> 0
irb(main):002:0> i=0; for i in [1,2,3]; end; i
=> 3
Yakut 1.8.6
irb(main):001:0> i=0; [1,2,3].each {|i|}; i
=> 3
Hash.index
Kullanımdan kaldırıldıYakut 1.9
irb(main):001:0> {1=>2}.index(2)
(irb):18: warning: Hash#index is deprecated; use Hash#key
=> 1
irb(main):002:0> {1=>2}.key(2)
=> 1
Yakut 1.8.6
irb(main):001:0> {1=>2}.index(2)
=> 1
Eylem: Hash.key kullan
Fixnum.to_sym
Şimdi gittiYakut 1.9
irb(main):001:0> 5.to_sym
NoMethodError: undefined method 'to_sym' for 5:Fixnum
Yakut 1.8.6
irb(main):001:0> 5.to_sym
=> nil
(Devamı) Ruby 1.9
# Find an argument value by name or index.
def [](index)
lookup(index.to_sym)
end
svn.ruby-lang.org/repos/ruby/trunk/lib/rake.rb
Yakut 1.9
irb(main):001:0> {:a=>"a", :c=>"c", :b=>"b"}
=> {:a=>"a", :c=>"c", :b=>"b"}
Yakut 1.8.6
irb(main):001:0> {:a=>"a", :c=>"c", :b=>"b"}
=> {:a=>"a", :b=>"b", :c=>"c"}
Sipariş, kampanya siparişidir
Yakut 1.9
irb(main):001:0> /\x80/u
SyntaxError: (irb):2: invalid multibyte escape: /\x80/
Yakut 1.8.6
irb(main):001:0> /\x80/u
=> /\x80/u
tr
ve Regexp
Şimdi Unicode'u AnlayınYakut 1.9
unicode(string).tr(CP1252_DIFFERENCES, UNICODE_EQUIVALENT).
gsub(INVALID_XML_CHAR, REPLACEMENT_CHAR).
gsub(XML_PREDEFINED) {|c| PREDEFINED[c.ord]}
pack
ve unpack
Yakut 1.8.6
def xchr(escape=true)
n = XChar::CP1252[self] || self
case n when *XChar::VALID
XChar::PREDEFINED[n] or
(n>128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*')))
else
Builder::XChar::REPLACEMENT_CHAR
end
end
unpack('U*').map {|n| n.xchr(escape)}.join
BasicObject
Daha Acımasız BlankSlate
Yakut 1.9
irb(main):001:0> class C < BasicObject; def f; Math::PI; end; end; C.new.f
NameError: uninitialized constant C::Math
Yakut 1.8.6
irb(main):001:0> require 'blankslate'
=> true
irb(main):002:0> class C < BlankSlate; def f; Math::PI; end; end; C.new.f
=> 3.14159265358979
Eylem: Kullanım :: Matematik :: PI
Yakut 1.9
irb(main):002:0> class C < SimpleDelegator; end
=> nil
irb(main):003:0> C.new('').class
=> String
Yakut 1.8.6
irb(main):002:0> class C < SimpleDelegator; end
=> nil
irb(main):003:0> C.new('').class
=> C
irb(main):004:0>
Yakut 1.9
irb(main):004:1> $KCODE = 'UTF8'
(irb):4: warning: variable $KCODE is no longer effective; ignored
=> "UTF8"
Yakut 1.8.6
irb(main):001:0> $KCODE = 'UTF8'
=> "UTF8"
instance_methods
Şimdi bir Sembol DizisiYakut 1.9
irb(main):001:0> {}.methods.sort.last
=> :zip
Yakut 1.8.6
irb(main):001:0> {}.methods.sort.last
=> "zip"
Eylem: instance_methods.include değiştirilsin mi? method_defined ile?
# coding: utf-8
# -*- encoding: utf-8 -*-
#!/usr/local/rubybook/bin/ruby
# encoding: utf-8
Yakut 1.9
{a: b}
redirect_to action: show
Yakut 1.8.6
{:a => b}
redirect_to :action => show
Yakut 1.9
[1,2].each {|value; t| t=value*value}
Yakut 1.9
[1,2].inject(:+)
Yakut 1.8.6
[1,2].inject {|a,b| a+b}
to_enum
Yakut 1.9
short_enum = [1, 2, 3].to_enum
long_enum = ('a'..'z').to_enum
loop do
puts "#{short_enum.next} #{long_enum.next}"
end
Yakut 1.9
e = [1,2,3].each
Yakut 1.9
p = -> a,b,c {a+b+c}
puts p.(1,2,3)
puts p[1,2,3]
Yakut 1.8.6
p = lambda {|a,b,c| a+b+c}
puts p.call(1,2,3)
Yakut 1.9
Complex(3,4) == 3 + 4.im
Yakut 1.9
irb(main):001:0> 1.2-1.1
=> 0.0999999999999999
Yakut 1.9
/\p{Space}/
Yakut 1.8.6
/[:space:]/
Yakut 1.9
def foo(first, *middle, last)
(->a, *b, c {p a-c}).(*5.downto(1))
Yakut 1.9
f = Fiber.new do
a,b = 0,1
Fiber.yield a
Fiber.yield b
loop do
a,b = b,a+b
Fiber.yield b
end
end
10.times {puts f.resume}
Yakut 1.9
match =
while line = gets
next if line =~ /^#/
break line if line.find('ruby')
end
Yakut 1.9
def toggle
def toggle
"subsequent times"
end
"first time"
end
HTH!
Birçoğu artık Kazma yerine Ruby Programlama Dilini tavsiye ediyor - daha da önemlisi, 1.8 / 1.9 farklarının tüm ayrıntılarına sahip.
Birkaç değişiklik daha:
Bir uyarıcı tekil dizi döndürmek:
def function
return *[1]
end
a=function
dizi argümanları
def function(array)
array.each { |v| p v }
end
function "1"