루비의 “현재”버전 (1.8)과 “새”버전 (1.9)의 차이점은 명확하지 않습니다. 차이점에 대한 “쉬운”또는 “간단한”설명이 있으며 왜 그렇게 다른가요?
답변
Sam Ruby에는 차이점을 설명 하는 멋진 슬라이드 쇼가 있습니다.
보다 쉽게 참조 할 수 있도록이 정보를 인라인으로 가져오고 추상적 인 미래에 링크가 중단 될 경우를 대비하여 Sam의 슬라이드 개요는 다음과 같습니다. 슬라이드 쇼는 검토하기에 덜 부담스럽지 않지만 이와 같은 목록에 모두 배치하는 것도 도움이됩니다.
Ruby 1.9-주요 기능
- 공연
- 스레드 / 섬유
- 인코딩 / 유니 코드
- gems는 (대부분) 내장되어 있습니다.
- if 문은 Ruby에서 범위를 도입하지 않습니다.
무엇이 변경 되었습니까?
단일 문자열.
루비 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을 사용하십시오.
콜론이 When 문에서 더 이상 유효하지 않음
루비 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
조치 : 세미콜론, then 또는 개행을 사용하십시오.
블록 변수는 이제 섀도우 로컬 변수
루비 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
(계속) 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
이제 순서가 지정되지 않은 해시 키
루비 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
조치 : :: Math :: PI 사용
위임 변경
루비 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>
$ 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"
응답 : instance_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
Lambda 속기
루비 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
정규식 “속성”
루비 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!
답변
한 가지 큰 차이점은 Matz의 인터프리터에서 성능에 크게 도움이되는 바이트 코드 가상 머신 인 YARV 로의 이동 입니다.
답변
많은 사람들이 이제 Pickaxe보다 Ruby 프로그래밍 언어 를 권장 합니다. 요점은 1.8 / 1.9 차이점에 대한 모든 세부 정보가 있습니다.
답변
추가 변경 사항 :
표시 싱글 톤 배열 반환 :
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”에 대한 정의되지 않은 메소드`each ‘: String