문제

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>

결함 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"

행동: 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'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top