रूबी 1.8 और रूबी 1.9 के बीच क्या अंतर है


102

मैं रूबी (1.8) के "वर्तमान" संस्करण और "नया" संस्करण (1.9) के बीच के अंतरों पर स्पष्ट नहीं हूं। क्या मतभेदों की "आसान" या "सरल" व्याख्या है और यह इतना अलग क्यों है?


1
मेरा मानना ​​है कि रूबी 1.8.6 - रूबी 1.8.7 में 1.9 से बहुत सारे पुस्तकालय निर्माण हैं।
एंड्रयू ग्रिम

किसी भी अधिक मैं 1.8 संस्करणों को "पुराने" संस्करण मानता हूं, और 1.9.2+ "वर्तमान" वाले। मैं संगतता जांच के लिए केवल 1.8.7 का उपयोग करता हूं लेकिन 1.9.2 में विकसित करता हूं।
टिन मैन

5
@Telemachus: लिंक का टूटना।
एंड्रयू ग्रिम

1
@Telemachus, एंड्रयू ग्रिम - यह आर्काइव.ऑर्ग लिंक लिंक काम करता है - web.archive.org/web/20090423003136/http://eigenclass.org/…
J.Merrill

जवाबों:


170

सैम रूबी के पास एक शांत स्लाइड शो है जो मतभेदों को रेखांकित करता है

इस जानकारी को आसान संदर्भ के लिए इनलाइन लाने के हित में, और यदि लिंक अमूर्त भविष्य में मृत हो जाता है, तो यहां सैम की स्लाइड का अवलोकन किया गया है। स्लाइड शो समीक्षा करने के लिए कम है, लेकिन यह सब इस तरह एक सूची में बाहर रखा भी उपयोगी है।

रूबी 1.9 - प्रमुख विशेषताएं

  • प्रदर्शन
  • धागे / रेशे
  • एन्कोडिंग / यूनिकोड
  • रत्न अब (ज्यादातर) निर्मित है
  • अगर बयान रूबी में गुंजाइश नहीं पेश करते हैं।

क्या बदला है?

एकल चरित्र तार।

रूबी 1.9

irb(main):001:0> ?c
=> "c"

रूबी 1.8.6

irb(main):001:0> ?c
=> 99

स्ट्रिंग सूचकांक।

रूबी 1.9

irb(main):001:0> "cat"[1]
=> "a"

रूबी 1.8.6

irb(main):001:0> "cat"[1]
=> 97

{"a", "b"} कोई लंबा समर्थित नहीं

रूबी 1.9

irb(main):002:0> {1,2}
SyntaxError: (irb):2: syntax error, unexpected ',', expecting tASSOC

रूबी 1.8.6

irb(main):001:0> {1,2}
=> {1=>2}

क्रिया: {1 => 2} में बदलें


Array.to_s अब इसमें विराम चिह्न शामिल हैं

रूबी 1.9

irb(main):001:0> [1,2,3].to_s
=> "[1, 2, 3]"

रूबी 1.8.6

irb(main):001:0> [1,2,3].to_s
=> "123"

क्रिया: इसके बजाय .join का उपयोग करें


जब विवरण में बृहदान्त्र कोई लंबा वैध

रूबी 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'

रूबी 1.8.6

irb(main):001:0> case 'a'; when /\w/: puts 'word'; end
word

क्रिया: अर्धविराम, फिर, या न्यूलाइन का उपयोग करें


ब्लॉक चर अब छाया स्थानीय चर

रूबी 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

रूबी 1.8.6

irb(main):001:0> i=0; [1,2,3].each {|i|}; i
=> 3

Hash.index पदावनत

रूबी 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

रूबी 1.8.6

irb(main):001:0> {1=>2}.index(2)
=> 1

क्रिया: Hash.key का उपयोग करें


Fixnum.to_sym अब चला गया

रूबी 1.9

irb(main):001:0> 5.to_sym
NoMethodError: undefined method 'to_sym' for 5:Fixnum

रूबी 1.8.6

irb(main):001:0> 5.to_sym
=> nil

(योगदान) रूबी 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


हैश कीज अब अनियंत्रित

रूबी 1.9

irb(main):001:0> {:a=>"a", :c=>"c", :b=>"b"}
=> {:a=>"a", :c=>"c", :b=>"b"}

रूबी 1.8.6

irb(main):001:0> {:a=>"a", :c=>"c", :b=>"b"}
=> {:a=>"a", :b=>"b", :c=>"c"}

आदेश प्रविष्टि क्रम है


स्ट्रिकटर यूनिकोड रेगुलर एक्सप्रेशंस

रूबी 1.9

irb(main):001:0> /\x80/u
SyntaxError: (irb):2: invalid multibyte escape: /\x80/

रूबी 1.8.6

irb(main):001:0> /\x80/u
=> /\x80/u

trऔर Regexpअब यूनिकोड को समझें

रूबी 1.9

unicode(string).tr(CP1252_DIFFERENCES, UNICODE_EQUIVALENT).
  gsub(INVALID_XML_CHAR, REPLACEMENT_CHAR).
  gsub(XML_PREDEFINED) {|c| PREDEFINED[c.ord]}

pack तथा unpack

रूबी 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 अधिक क्रूर थान BlankSlate

रूबी 1.9

irb(main):001:0> class C < BasicObject; def f; Math::PI; end; end; C.new.f
NameError: uninitialized constant C::Math

रूबी 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

क्रिया: उपयोग :: गणित :: पीआई


प्रत्यायोजन परिवर्तन

रूबी 1.9

irb(main):002:0> class C < SimpleDelegator; end
=> nil
irb(main):003:0> C.new('').class
=> String

रूबी 1.8.6

irb(main):002:0> class C < SimpleDelegator; end
=> nil
irb(main):003:0> C.new('').class
=> C
irb(main):004:0>

दोष 17700


$ KCODE चेतावनी का उत्पादन

रूबी 1.9

irb(main):004:1> $KCODE = 'UTF8'
(irb):4: warning: variable $KCODE is no longer effective; ignored
=> "UTF8"

रूबी 1.8.6

irb(main):001:0> $KCODE = 'UTF8'
=> "UTF8"

instance_methods अब प्रतीक का एक ऐरे

रूबी 1.9

irb(main):001:0> {}.methods.sort.last
=> :zip

रूबी 1.8.6

irb(main):001:0> {}.methods.sort.last
=> "zip"

क्रिया: example_methods.include बदलें? Method_defined के साथ?


स्रोत फ़ाइल एन्कोडिंग

बुनियादी

# coding: utf-8

Emacs

# -*- encoding: utf-8 -*-

कुटिया

#!/usr/local/rubybook/bin/ruby
# encoding: utf-8

असली थ्रेडिंग

  • दौर कि शर्ते
  • इम्प्लिक्ट आर्डरिंग असेसमेंट
  • टेस्ट कोड

नया क्या है?

हैश कीज़ के रूप में प्रतीक के लिए वैकल्पिक सिंटैक्स

रूबी 1.9

{a: b}

redirect_to action: show

रूबी 1.8.6

{:a => b}

redirect_to :action => show

ब्लॉक स्थानीय चर

रूबी 1.9

[1,2].each {|value; t| t=value*value}

इंजेक्ट तरीके

रूबी 1.9

[1,2].inject(:+)

रूबी 1.8.6

[1,2].inject {|a,b| a+b}

to_enum

रूबी 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

कोई ब्लॉक नहीं? Enum!

रूबी 1.9

e = [1,2,3].each

लैंबडा शॉर्टहैंड

रूबी 1.9

p = -> a,b,c {a+b+c}
puts p.(1,2,3)
puts p[1,2,3]

रूबी 1.8.6

p = lambda {|a,b,c| a+b+c}
puts p.call(1,2,3)

जटिल आंकड़े

रूबी 1.9

Complex(3,4) == 3 + 4.im

दशमलव अभी भी डिफ़ॉल्ट नहीं है

रूबी 1.9

irb(main):001:0> 1.2-1.1
=> 0.0999999999999999

Regex "गुण"

रूबी 1.9

/\p{Space}/

रूबी 1.8.6

/[:space:]/

मध्य में बंटवारा

रूबी 1.9

def foo(first, *middle, last)

(->a, *b, c {p a-c}).(*5.downto(1))

रेशे

रूबी 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}

मूल्यों को तोड़ो

रूबी 1.9

match =
   while line = gets
     next if line =~ /^#/
     break line if line.find('ruby')
   end

"नेस्टेड" तरीके

रूबी 1.9

def toggle
  def toggle
    "subsequent times"
  end
  "first time"
end

HTH!


3
HTH == "आशा है कि मदद करता है"। मुझे यह देखना था। क्या आप मुझे दिए गए उत्तर की ओर संकेत कर सकते हैं, जहाँ आपको उम्मीद नहीं थी कि यह मदद करेगा?
क्रिस वेसलिंग

या आप मदद करने के लिए खुश मतलब है? तदनुसार संपादित करें। या इसे हटा दें, यदि आपकी खुशी / उम्मीद आपके सभी उत्तरों के लिए मायने रखती है। ;-)
क्रिस वेसलिंग

10
नहीं, मैं इसे छोड़ने जा रहा हूं। कुल उत्तर के प्रतिशत के रूप में, यह ऋणात्मक है और या तो व्याख्या मेरे साथ ठीक है। धन्यवाद।
टिम सुलिवन

आपके द्वारा दिए गए लिंक के अनुसार, प्रतिनिधिमंडल में बदलाव एक बग था और इसे ठीक कर दिया गया है।
काइल स्ट्रैंड

"Range.include?" के बीच असंगतता के बारे में क्या? तरीका? रूबी v1.8.7 v1.9 की तुलना में एक अलग परिणाम देता है
लुकास पॉटरस्की


4

अब कई लोग पिकाक्स पर रूबी प्रोग्रामिंग लैंग्वेज की सलाह देते हैं - इस बिंदु पर अधिक, इसमें 1.8 / 1.9 अंतर के सभी विवरण हैं।


1
मुझे वे दोनों पसंद हैं। पिकैक्स बुक कुछ चीजों पर अधिक पूरी तरह से चर्चा करती है लेकिन जब आप किसी चीज के लिए जल्दी से स्कैन करना चाहते हैं तो रूबी प्रोग्रामिंग लैंग्वेज अच्छी है। यह "संक्षेप" पुस्तक के करीब है।
टीन मैन

1

कुछ और बदलाव:

एक शानदार सिंगलटन सरणी लौटना:

def function
  return *[1]
end

a=function
  • रूबी 1.9: [1]
  • रूबी 1.8: 1

सरणी तर्क

def function(array)
  array.each { |v| p v }
end
function "1"
  • रूबी 1.8: "1"
  • रूबी 1.9: "1" के लिए अपरिभाषित विधि `प्रत्येक ': स्ट्रिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.