Ruby超入門 2周目 CHAPTER8-4 オブジェクトに データを持たせる まで

f:id:kkouji0224:20191029231558p:plain

『ゼロからわかる Ruby 超入門 (かんたんIT基礎講座) 』
github.com

 

こんばんは。季節の変わり目で色々とストレスがたまりますね。koujiです。プログラミングは頑張るぞー!!って感じよりも楽しんでやってるのでストレス発散ですね。このブログも同じですね。

 

ってことで今日もCHAPTER8を振り返っていきまーす!

 

インスタンス変数

 

class Onebuckwheat
    def order(item)
        puts "一杯の#{item}をください…"
        @name = item
    end
    def bill
        puts "#{@name}一杯はおいくらですか…?"
    end
    def mercy
        puts "#{@name}一杯ぐらい気にせず食べてくんな!お代はまた今度でいいよ!"
    end    
end
buckwheat = Onebuckwheat.new
buckwheat.order("かけそば")
buckwheat.bill
buckwheat.mercy

 

お気づきだろうか… 一杯のかけそばを表現してみました… それは置いておいて。orderメソッドの中でitemを@nameに代入してて、この@付きの変数がインスタンス変数ってやつだね。@nameじゃなくて、nameにするとどうなっちゃうかっていうと、スコープ範囲の関係で、定義したメソッドの中では見えるんだけど、外からだと見えなくなっちゃう。そこで@変数名のインスタンス変数の登場ですよ!インスタンス変数は同じオブジェクトの中であればメソッドをまたいで使えちゃう便利な変数だねぇ。で、同じオブジェクトであればって書くと、ややこしくなってしまうかもだけど、buckwheat1 = Onebuckwheat.newこれが1つのオブジェクトってことね。で、例えばbuckwheat2 = Onebuckwheat.newがあるとすると、1と2は別のオブジェクトになるってことね。

 

class Onebuckwheat
    def order(item)
        puts "一杯の#{item}をください…"
        @name = item
    end
    def bill
        puts "#{@name}一杯はおいくらですか…?"
    end
    def mercy
        puts "#{@name}一杯ぐらい気にせず食べてくんな!お代はまた今度でいいよ!"
    end    
end
buckwheat1 = Onebuckwheat.new
buckwheat2 = Onebuckwheat.new
buckwheat1.order("かけそば")
buckwheat1.bill
buckwheat1.mercy
buckwheat2.order("月見そば")
buckwheat2.bill
buckwheat2.mercy

 

こういうことね。1と2は別のインスタンス(オブジェクト)ってことだねー。

 

インスタンス変数を取得するメソッドをつくる

 

class Onebuckwheat
    def order(item)
        puts "一杯の#{item}をください…"
        @name = item
    end
    def name    #ここねここここ!
        @name
    end
    def bill
        puts "#{@name}一杯はおいくらですか…?"
    end
    def mercy
        puts "#{@name}一杯ぐらい気にせず食べてくんな!お代はまた今度でいいよ!"
    end    
end
buckwheat1 = Onebuckwheat.new
buckwheat1.order("かけそば")
buckwheat1.bill
buckwheat1.mercy
puts buckwheat1.name    #ここですよここここ!

 

オブジェクトの外でインスタンス変数を取得したくなったらどうすれば良いかって感じなんだけど、上に書いてあるようにnameメソッドを作ってあげればいいんだねぇ。nameメソッドの中身は@nameね。このnameメソッドを定義してあげるだけど、上みたいな感じで.nameでインスタンス変数を取得できちゃいまっす!便利!

 

インスタンス変数へ代入するメソッドをつくる

 

class Onebuckwheat
    def name=(text)
        @name = text
    end
    def order
        puts "一杯の#{name}をください…"
    end
    def name    
        @name
    end
    def bill
        puts "#{name}一杯はおいくらですか…?"
    end
    def mercy
        puts "#{name}一杯ぐらい気にせず食べてくんな!お代はまた今度でいいよ!"
    end    
end
buckwheat1 = Onebuckwheat.new
buckwheat1.name= "かけそば"
buckwheat1.order
buckwheat1.bill
buckwheat1.mercy

 

 これもそんなに難しくなくて、インスタンス変数に代入するメソッドを定義してるだけだね。書き方が少し変わっててdef name=(引数)って感じ。慣習的な書き方らしいんだけど、慣習に従うとメリットがあるので素直にしたがっておこう。で、インスタンス変数に代入して、nameメソッドも書いてあるから他の場所では@nameじゃなくてnameでもいけちゃうって感じだねぇ。いやーこれは頭の体操になるっていうか面白いねぇ。

 

で、instanc_variablesメソッドって便利なものもある。これはオブジェクトが持ってるインスタンス変数の変数名を一覧で取得できちゃうメソッドなんだね。で、ここでも面白いなぁと思うのが、インスタンス変数は代入したときに作られるから、代入前にinstanc_variablesメソッドを書いても@nameはでてこないんだよね。

 

 

一杯のかけそばをください…
かけそば一杯はおいくらですか…?
かけそば一杯ぐらい気にせず食べてくんな!お代はまた今度でいいよ!
[:@name]

 

代入後にinstanc_variables書いてあげると[:@name]こんな感じで表示される。

 

[ ]
一杯のかけそばをください…
かけそば一杯はおいくらですか…?
かけそば一杯ぐらい気にせず食べてくんな!お代はまた今度でいいよ!

 

代入前にinstanc_variables書くと@nameでてこなくて[]ってなっちゃう。インスタンス変数ないねーって感じだね。こりゃー面白い。

 

インスタンス変数は代入後につくられるっ!!!

 

ってな感じで今日もRuby超入門の振り返りでした。いやーやっぱり面白いね。

 

ってことで今日はこの辺で〜!

 

アディオス!