0

私はルビーの世界に不慣れで、現在次のコードに苦労しています。

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に助けてくれてありがとう

4

1 に答える 1

4

いくつかの空白が必要です。aで始まるトークン:は、Rubyのシンボルです。

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

そして最後の行puts arは大丈夫です。

于 2012-12-19T03:46:46.487 に答える