按ruby中的属性排序对象数组会引发未定义的方法错误

时间:2012-12-19 03:41:43

标签: ruby sorting

我是红宝石世界的新手,我正在努力使用以下代码:

class Item
  attr_accessor :x, :y
  def initialize(x,y)
    @x, @y = x, y
  end
  def to_s
    "(#@x,#@y)"
  end
end
a = Item.new(1,nil)
b = Item.new(2,nil)
c = Item.new(3,nil)
d = Item.new(4,nil)
e = Item.new(5,12)
f = Item.new(6,5)
g = Item.new(12,6)

ar = [ a, b, c, d, e, f,g]
ar.sort! {|i1,i2| (i2.y?i2.y:i2.x) <=> (i1.y?i1.y:i1.x)}
puts array.ar("\n")

这会在排序行中引发以下错误:

undefined method `x' for :i2:Symbol (NoMethodError)

显然,x是Item类的实例方法,所以我的猜测是i1和i2不是Item类的实例 - 但如果它们不是,那么它们是什么?

(顺便说一下,我在这里要做的是根据属性y对对象数组进行排序,如果y为nil,则根据属性x而不是)。

感谢您对ruby-newby的任何帮助

1 个答案:

答案 0 :(得分:4)

你需要一些空格。任何以:开头的标记都是Ruby中的符号。

ar.sort! {|i1,i2| (i2.y ? i2.y : i2.x) <=> (i1.y ? i1.y : i1.x)}

最后一行puts ar没问题。