차이에서는`배열#to_s`루비에서 1.8 와 루비 1.9[중복]
문제
가능한 중복:
루비 1.9 배열입니다.to_s 다르게 동작?
누가 말할 수 있는 나에게 무엇을 변경 사 루비 1.8.7 와 루비 1.9.3.나는 예 아래에 나열된 동작하는 완전히 다른에서 2 개의 버전에 따라 루비 문서는 나타나지 않도 변경 사이의 이러한 버전이 있습니다.
Ruby1.8
number = '123-45-6789'
# => "123-45-6789"
number.scan(/[0-9]/)
# => ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
number.scan(/[0-9]/).to_s
# => "123456789"
루비 1.9
number = '123-45-6789'
# => "123-45-6789"
number.scan(/[0-9]/)
# => ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
number.scan(/[0-9]/).to_s
# => "[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"]"
지 않고 다른 방법이 궁금 변경된 것과 같이 두 가지 버전이 있습니다.
해결책
여기에 실제로는 루비 소스 코드:
1.8.7:
rb_ary_to_s(ary)
VALUE ary;
{
if (RARRAY(ary)->len == 0) return rb_str_new(0, 0);
return rb_ary_join(ary, rb_output_fs);
}
다시 말해서 1.8.7, to_s
전화 join
.
1.9.3:
rb_ary_inspect(VALUE ary)
{
if (RARRAY_LEN(ary) == 0) return rb_usascii_str_new2("[]");
return rb_exec_recursive(inspect_ary, ary, 0);
}
VALUE
rb_ary_to_s(VALUE ary)
{
return rb_ary_inspect(ary);
}
다시 말해서 1.9.3, to_s
대 inspect
.
참고:에서 미래,당신에 대해 궁금한 차이가 당신이 관찰하는 두 가지 버전 시도할 수 있습니다 살펴보고 소스 코드입니다.쉽게 풀에서 아래로 여기: https://github.com/ruby/ruby
모든 것을 쉽게 찾을 수 있지만,당신이 주위를 검색한 자주 찾을 수 있는 좋은 지도한다.이 경우에, array.c
은 당신이 무엇을 찾고 있습니다.
그런 다음 전환할 수 있습니다 사이에 앞뒤로 버전을 발행하여 git checkout ruby_1_8_7
고 git checkout ruby_1_9_3
.
다른 팁
이 to_s
변경되었습니다 실제로 무엇을 변환하는 개체를 문자열해야 할 것입니다.
을 고려 1.8 구현...
- 을 보낼 때를
to_s
는 방법을 배열체,그것은 말 그대로지array_object.join('').to_s
.이 이럴 않습니다 너무 많은. - 이 구현한 구역에서 무선 인터넷을 무료로 배열 개체입니다.이
to_s
방법으로 주로가에서 손으로inspect
방법(_correct 날 내가 잘못하기 때문에 나는 내 머리를 여기에).면 당신이 찾아야에서의 출력to_s
방법,여기에 당신에게 말할 수 없는 경우에는 개체의Array
,String
나Fixnum
클래스입니다.
입력 1.9 구현...
- 구조물의 출력을 명확히 보여주는 객체가 배열입니다.
는 말이라고 생각했 UX 디자인을 결정에서 루비 팀기 때문에 to_s
에 1.8 은 상당히 빠르다!
이것을 고려 microbenchmark...
OS_X_Terminal $> time ruby -e "(1..1000000).to_a.map(&:to_s).to_s"
| Ruby Version | average runtime |
| 1.9.3 | 1.678 |
| 1.9.2 | 1.817 |
| 1.8.7 | 1.106 |
이것은 모두가 지금까지.댓글은 언제나 환영합니다(:
루비가 .to_s
가하는 것에 대해 더 똑똑해 보이는 것처럼 보입니다.그것은 벙어리가되어야하며 어떤 이유로 어레이의 모든 항목이 나란히 나란히 나열합니다.Ruby 1.9에서는 배열이 필요하며 문자 그대로 문자열로 바뀝니다.그것이 똑똑한 똑똑한 방식으로 .to_s
를 처리하는 방법입니다.