Bug #7182

bug with Array#sort ?

Added by 中島 拓哉 over 1 year ago. Updated over 1 year ago.

[ruby-dev:46228]
Status:Rejected
Priority:Normal
Assignee:-
Category:core
Target version:1.9.2
ruby -v:1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux] Backport:

Description

Array.sortにコードブロックを与え、出力した際( p ary.sort do |a,b| .. end )にコードブロックでのソート条件が無視されて出力される

case 1

ary = ["1", "2", "10", "11", "3", "4", "23"]
p ary.sort

result: ["1", "10", "11", "2", "23", "3", "4"]

#case 2
ary = ["1", "2", "10", "11", "3", "4", "23"]
p ary.sort do |a, b|
a.toi <=> b.toi
end

result: ["1", "10", "11", "2", "23", "3", "4"]

#case 3
ary = ["1", "2", "10", "11", "3", "4", "23"]
p ary.sort! do |a, b|
a.toi <=> b.toi
end

result: ["1", "10", "11", "2", "23", "3", "4"]

#case 4
ary = ["1", "2", "10", "11", "3", "4", "23"]
ary.sort! do |a, b|
a.toi <=> b.toi
end
p ary

result: ["1", "2", "3", "4", "10", "11", "23"]

#case 5
ary = ["1", "2", "10", "11", "3", "4", "23"]
ary2 = ary.sort do |a, b|
a.toi <=> b.toi
end
p ary2

result: ["1", "2", "3", "4", "10", "11", "23"]

#case 6
ary = ["1", "2", "10", "11", "3", "4", "23"]
p ary.sort do |a, b|
a.toi <=> b.toi
end

result: ["1", "10", "11", "2", "23", "3", "4"]

History

#1 Updated by 中島 拓哉 over 1 year ago

case 2,3,6は["1", "2", "3", "4", "10", "11", "23"]が期待値だと思うのですがどうでしょう。

#2 Updated by 中島 拓哉 over 1 year ago

do..endの優先度が低くてpの引数扱いされてるんですね。
失礼いたしました。 bugではありませんでした。

#3 Updated by Nobuhiro IMAI over 1 year ago

case 2,3,6は["1", "2", "3", "4", "10", "11", "23"]が期待値だと思うのですがどうでしょう。

これは、

p(ary.sort) do |a, b|
a.toi <=> b.toi
end

と解釈されて、ブロックは p に渡したと解釈されて、無視されています。
() を使うか、ブロックを {} で書くか、一旦別の変数に代入すると、期待する通りに動くと思います。

p(ary.sort do |a, b|
a.toi <=> b.toi
end)

p ary.sort{|a, b|
a.toi <=> b.toi
}

ary2 = ary.sort do |a, b|
a.toi <=> b.toi
end
p ary2

#4 Updated by 中島 拓哉 over 1 year ago

ご説明ありがとうございます。
非常に勉強になりました、お騒がせしてしまい申し訳ございません。

#5 Updated by Shota Fukumori over 1 year ago

  • Status changed from Open to Rejected

Also available in: Atom PDF