Ruby:字符串与字符串的比较失败(参数错误)

4

这是我的Ruby代码:

books = ["Charlie and the Chocolate Factory", "War and Peace", "Utopia", "A Brief History of Time", "A Wrinkle in Time"]

books.sort! {

  |firstBook, secondBook|
  boolean_value = firstBook <=> secondBook
  print "first book is =  '#{firstBook}'"
  print " , second book is = '#{secondBook}'"
  puts  " and there compare result is #{boolean_value}"

}

问题:

  1. 这段代码运行一次后就会出现错误in 'sort!': comparison of String with String failed (ArgumentError)
  2. firstbook = "Charlie and the Chocolate Factory"时,secondBook应该是"War and Peace",但是代码选择了"Utopia"进行比较。为什么?

  1. Array#sort! 期望块返回一个数字,而你的最后一条语句使用了 puts,返回了 nil。
  2. 我猜测 Array#sort! 使用快速排序算法进行比较,所以选择 "Utopia" 作为枢轴。
- Vu Minh Tan
当我在一个数组上使用'sort'时,出现了错误,这个数组不小心混合了字符串和整数值。字符串值是整数的字符串,因此在初始化字符串数组元素时,在字符串后缀".to_i"解决了问题。似乎没有其他StackOverflow问题涉及到这个问题。 - Leonard
1个回答

5

请确保你从传递给 sort! 的代码块中返回比较结果。

目前,你返回了 nil(最后一个语句的返回值,即 puts),这会导致不可预测的结果。

请将你的代码更改为:

books = ["Charlie and the Chocolate Factory", "War and Peace", "Utopia", "A Brief History of Time", "A Wrinkle in Time"]

books.sort! {

  |firstBook, secondBook|
  boolean_value = firstBook <=> secondBook
  print "first book is =  '#{firstBook}'"
  print " , second book is = '#{secondBook}'"
  puts  " and there compare result is #{boolean_value}"

  boolean_value  # <--- this line has been added
}

并且一切都会正常工作。


离题,有几个小问题:

  • 在Ruby中,约定使用下划线分隔变量名中的单词。例如,您应该将firstBook重命名为first_book
  • 在命名变量时要非常小心。这里的变量boolean_value有点误导人,因为它不是truefalse,而是-101

1
太棒了。感谢您宝贵的建议。但是为什么选择“乌托邦”作为第二本书进行比较呢? - paul
2
@paul 我不确定,但如果我要猜的话,我会说Ruby在底层使用了快速排序算法,并选择Utopia作为快排的枢轴。显然,中间元素是枢轴的合理候选者 - Cristian Lupascu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接