デバッグ用にメッセージを出力させてみるので実行させて観察してみてください
ruby
1class Point
2 attr_accessor :x, :y
3
4 def initialize(x,y)
5 puts "Point##{__id__.to_s(36)}を作ります"
6 @x,@y=x,y
7 end
8
9
10 def [] (index)
11 puts "Point##{__id__.to_s(36)}[#{index}]を取得します"
12 case index
13 when 0
14 x
15 when 1
16 y
17 else
18 raise ArugmentError,"out of range '#{index}'"
19 end
20 end
21
22 def []=(index,val)
23 puts "Point##{__id__.to_s(36)}[#{index}]を#{val}で書き換えます"
24 case index
25 when 0
26 self.x=val
27 when 1
28 self.y=val
29 else
30 raise ArugmentError, "out of range '#{index}'"
31 end
32 end
33end
34
35p Point.new(3,6)[0] #=>3
36p Point.new(3,6)[1]=2 #=>2
37p Point.new(3,6)[1] #=>2?
38point = Point.new(3,6)
39p point[1] #=> 6
40p point[1] = 2 #=> 2
41p point[1] #=> 2
42p Point.new(3,6)[2] #=>Arugmenterror
結果は当環境ですと
Point#dv664を作ります
Point#dv664[0]を取得します
3
Point#dv588を作ります
Point#dv588[1]を2で書き換えます
2
Point#dv4wkを作ります
Point#dv4wk[1]を取得します
6
Point#dv2t0を作ります
Point#dv2t0[1]を取得します
6
Point#dv2t0[1]を2で書き換えます
2
Point#dv2t0[1]を取得します
2
Point#dv22cを作ります
Point#dv22c[2]を取得します
Traceback (most recent call last):
1: from -:42:in `<main>'
-:18:in `[]': uninitialized constant Point::ArugmentError (NameError)
Did you mean? ArgumentError
となりました。
(1)def []=(index,val)の()内にvalが入った理由がわかりません。
これに関してはそういうもの、としか言いようがないです。
(2)whenの後のself.x=valの意味はどういった意味なのか、どういった理由で入れなければならないのか、
attr_accessorによって定義したx=
メソッドを呼び出しています。
(3)なぜArugmentErrorを設定しないといけないのか、
ArgumentErrorの間違いだとは思いますが、逆に何を返せばいいと思いますか?
xとyの2つの値しかないので返せる値がない のが正解だと私は思いますし
できることなら[2]
などという呼び出しは間違ってますよ と教えてあげた方が親切ですね
(4)p列の3行目、p Point.new(3,6)[1]の返しが6になってしまうのはなぜか。
Point.new
する度に新しいインスタンスが作られるからです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/03 06:01