루비 1.8과 루비 1.9의 차이점은 무엇인가요?
문제
Ruby의 "현재" 버전(1.8)과 "새" 버전(1.9)의 차이점이 명확하지 않습니다.차이점과 왜 그렇게 다른지에 대한 "쉬운" 또는 "간단한" 설명이 있습니까?
해결책
샘 루비는 차이점을 간략히 보여주는 멋진 슬라이드쇼.
더 쉽게 참조할 수 있도록 이 정보를 인라인으로 가져오고 추상적인 미래에 링크가 끊어지는 경우를 대비하여 여기에 Sam의 슬라이드 개요가 있습니다.슬라이드쇼는 검토하기가 덜 부담스럽지만 이와 같은 목록에 모든 내용을 정리하는 것도 도움이 됩니다.
루비 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
(계속) 루비 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
행동: ::수학::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
이맥스
# -*- 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
블록이 없나요?열거!
루비 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
정규식 "속성"
루비 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의 통역사에서 야브, 성능에 큰 도움이 되는 바이트코드 가상 머신입니다.
이제 많은 사람들이 추천합니다 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":String에 대해 정의되지 않은 메소드 `each'