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超入門の振り返りでした。いやーやっぱり面白いね。

 

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

 

アディオス!

Ruby超入門 2周目 CHAPTER8-3 オブジェクトが呼び出せる メソッドを作る まで

f:id:kkouji0224:20191029231558p:plain

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

 

休みなのに一日雨だったぜ!!ということで今晩は。koujiです。今日からCHAPTER8の振り返りに入っていきまーす。段々と難易度が上がっていく気がするけど余裕だぜ!

 

クラスを作る

class Drink
end
drink = Drink.new
p drink.class

 

クラスの定義の仕方はclass クラス名 endって書くとできちゃう。で、.newメソッドでDrinkクラスのオブジェクトを作って変数drinkに代入してるんだね。で、drinkにclassメソッドを呼び出してる。変数drinkはDrinkクラスのオブジェクトなのでclassメソッドを使ってみるとDrinkってクラスに属してるよーってのがわかる。

 

ちなみにクラス名の規則があるんだね。クラス名はDrinkとかAlcみたいな感じで先頭を大文字にしてあげる。2単語以上を繋げる場合は先頭と区切りの文字を大文字にしてあげる慣習があるみたい。この書き方をキャメルケースっていうのね。ラクダ書き。

 

クラスにメソッドを定義する

class Drink
    def alc
        "まずはアルコールはビールで!"
    end
end
drink = Drink.new
puts drink.alc

 

メソッドをclass Drink 〜 endの中に書いてあげるとDrinkクラスのメソッドとして定義されるんだね。クラスに定義したメソッドを呼び出してるのがdrink.alcだね。newメソッドでDrinkクラスのオブジェクトを作って、それを変数drinkに代入してる。で、そのdrinkにクラスの中で定義したalcメソッドを呼び出してる感じ。オブジェクト.メソッドって書き方だね!変数に代入されてるときは変数.メソッドだね!

 

レシーバ

メソッドを呼び出されるオブジェクトのことをレシーバって言うらしい。上の場合だと変数drinkに代入されてるDrinkクラスのオブジェクトになるね。

 

drink.alcの場合はdrinkが「レシーバ」で、alcが「メソッド」

例えば2.even?だったら2が「レシーバ」で、even?が「メソッド」

 

便利だなーと思ったのがmethodメソッド

 

p drink.methods

 

こんな感じで書いてあげるとレシーバのオブジェクトが呼び出せるメソッドがばーって表示されるんだよっ!

 

:alc, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :instance_variable_get, :instance_variable_set, :instance_variables, :protected_methods, :private_methods, :public_send, :method, :public_method, :singleton_method, :define_singleton_method, :extend, :to_enum, :enum_for, :<=>, :===, :=~, :!~, :eql?, :respond_to?, :freeze, :inspect, :object_id, :send, :to_s, :display, :class, :nil?, :hash, :dup, :singleton_class, :clone, :then, :itself, :yield_self, :untaint, :taint, :tainted?, :trust, :untrust, :untrusted?, :singleton_methods, :frozen?, :methods, :public_methods, :equal?, :!, :==, :instance_exec, :!=, :instance_eval, :__id__, :__send__]

 

こんな感じ!これは便利だよねー。さっきクラスの中で定義したメソッドのalcもちゃんと入ってるね!!

 

クラスの中に引数を受け取るメソッドを定義

class Drink
    def alc_order(name)
        puts "#{name}で乾杯だ!"
    end
end
drink = Drink.new
drink.alc_order("ワイン")

 

上の場合だとalc_orderで引数を受け取れるようにして、drink.alc_order("ワイン")でalc_orderメソッドを呼び出して引数でワインを渡してる。で、渡されたワインを変数nameに代入してる感じだね。

 

クラスの中で同じクラスの他のメソッドを呼び出す

class Drink
    def alc
        "ウーロン" + shochu
    end
    def shochu
        "ハイ"
    end
end
drink = Drink.new
puts drink.alc

 

Drinkクラスの中でalcメソッドとshochuメソッドの2つを定義してみたよ。で、alcメソッドの中でshochuメソッドを呼び出してるって感じだね。クラスの外からメソッドを呼び出す時はdrink.alcのようにレシーバを指定するんだけど、クラスの中の場合はshochuだけのメソッド名だけで呼び出せちゃう。これは省略した書き方で、この場合は実行中のalcメソッドのレシーバのdrinkなのでDrinkクラスのオブジェクトがレシーバになるって感じ。ちょっとややこしいけど落ち着けばOK!

 

selfでレシーバを調べてみる

class Drink
    def alc
        p self
        "ウーロン" + shochu
    end
    def shochu
        "ハイ"
    end
end
drink = Drink.new
p drink
puts drink.alc

 

#<Drink:0x00005623db866af0>
#<Drink:0x00005623db866af0>
ウーロンハイ

 

こんな感じの実行結果になるんだけど、selfはその場所でメソッドを呼び出した時のレシーバを返す。shochuの前にselfを書いてあげると上みたいな結果になるんだよね。

 

p drinkとputs drink.nameが同じレシーバってのがわかるね。Drink:+同じ識別番号になってるもんね!これは面白いねー。

 

 

ってな感じで段々と難易度上がってきてる感はあるけど、やっぱり2周目やってると、「あーそういうことだったのね!スッキリ!」みたいなのとか「それなら、こうだったらどうなるんだろう?」みたいな感じで余計に沼に一歩一歩入り込んでいってる気がして面白いぜ!

 

超入門も残りわずかなので、スタート時の気持ちを忘れずに丁寧にやっていこう。

 

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

 

アディオス!

 

 

Ruby超入門 2周目 CHAPTER7- 4 変数には見える範囲がある まで

f:id:kkouji0224:20191027224451p:plain

 

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

 

最近はボーッとしてしまう時間が増え気味で、こんな時間からはてな書いてるkoujiです。こんばんは。眠くないような眠いようなそんな感じ。

 

ってことで今日はCHAPTER7の残りの振り返りをしていきまっす!

 

引数のデフォルト値 

def alc_order(item = "生中")
    "#{item}を一杯"
end
puts alc_order  #=> 生中を一杯
puts alc_order("ハイボール")  #=> ハイボールを一杯
puts alc_order("芋焼酎")  #=> 芋焼酎を一杯

 

メソッドの引数にはデフォルト値を指定することが出来ちゃう。上のプログラムの場合はalc_orderの引数itemに"生中"を指定してるよ。(引数 = デフォルト値)って感じで指定してあげる。そうするとどうなるかっていうと、メソッド呼び出し時に引数を書かないとデフォルト値に指定してる"生中"が変数itemに代入されるんだね!で、引数を指定してあげるとデフォルト値は使われないよ。やっぱり最初はビールからだよね…

 

キーワード引数

def alc_order(item:size:)
    "#{item}#{size}で!"
end
puts alc_order(item: "生"size: "中")  #=> 生の中で!
puts alc_order(size: "メガ"item: "ハイボール")  #=> ハイボールのメガで!
puts alc_order(size: "メガ"item: "ウーロンハイ")  #=> ウーロンハイのメガで!

 

見ての通り引数がitemとsizeの2つになったね。この場合だとメソッド呼び出し時も2つ書いてあげる必要があるんだけど、順番通りに書いてあげないとおかしなことになっちゃうよね。逆に書くとそのまんま逆になっちゃう。でもキーワード引数で書いてあげると順番は関係ないんだよね。itemは生でsizeは中みたいな感じ。書く量がふえちゃうけど便利かも。選択肢の1つとして覚えておこう…

 

ちなみにキーワード引数もデフォルト値の設定ができるよ。

def alc_order(item: "生"size:)
    "#{item}#{size}で!"
end
puts alc_order(size: "中")  #=> 生の中で!

 

こんな感じ。メソッド名(引数: デフォルト値, 引数)みたいな感じで書いてあげればオーケーだねー。もちろんデフォルト値は全ての引数に指定ができるよーん

 

ローカル変数とスコープ

def fuck
    text = "ファック!"
    puts text
end
fuck #=> ファック!

 

上のプログラムは普通に動くねー。

 

じゃーこれはどうでしょうか。

def fuck
    text = "ファック!"
end
fuck
puts text

 

5:in `<main>': undefined local variable or method `text' for main:Object (NameError)

 

エラーになっちゃうよ!!!

 

なんでかっていうと、メソッドの中で定義した変数は、メソッドの外からは見えないようになってるんだよ。んでもってメソッドの実行が終わると、メソッドの内の変数と例えば上のプログラムだと文字列のファック!は破棄されちゃうらしい。

 

で、変数には見える範囲と寿命がある。で、このことを「スコープ」という。ここまで出てきた変数はスコープの範囲がもっとも狭いローカル変数ってやつねっ!

 

ちなみに逆はどうなんだろうって思うじゃん。メソッドの外で定義した変数は、メソッドの中から見えるのかな?って。やっぱり見えないんだねぇ。なので、メソッドの中で必要なオブジェクトは引数を使って渡すんだね!

 

 

ってことでCHAPTER7はこれで終わり!スコープとかローカル変数とか新たに出てきた感じだけど、スコープが面白いなぁって感じ。メソッド内で定義したものは外から見えないし、メソッドの外で定義したものは、中から見えない。こういうのも「へぇ〜」って感じで面白い。この面白さを表現する言葉がでてこないんだけど、面白いんだよ!!

 

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

 

もう夜中の1時じゃないか…

Ruby超入門 2周目 CHAPTER7-2 メソッドへ オブジェクトを渡す まで

f:id:kkouji0224:20191027224451p:plain

 

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

 

こんばんは。つい先日までめちゃくちゃに体重かったんだけど回復してきました。よかったよかったkoujiです。うえの画像のLGTMってさっきまで意味をしらなかったんだけど、Looks good to meの略で「いいね!」みたいな感じなんだねぇ〜。知らないことがいっぱいだ。使っていこうかな…

 

ってことで今日はCHAPTER7のメソッドを振り返っていきまーす。

 

メソッドを定義する

 

def area
    puts 2 * 2
end
area

 

いままで元々あったメソッドを使ってきたんだけど、自分で作れちゃうってことだね。def メソッド名 処理 end って書く感じだね。上のはdefってDefinitionの略かな?定義を英語にするとDefinitionだと思う。きっとそう。で、endの外からメソッド名のareaで呼び出してる。ぼーっとしてるとputs areaって感じで書いちゃったりしちゃうかもだけど、puts 2 * 2になってるからなっ!

 

あーでも、計算と表示わけたくない?そう思うじゃん。思うよね。思うに違いないんだ。大丈夫だ問題ない。

 

def area
    2 * 2  #メソッドの最後の実行結果、この場合4が【戻り値】として呼び出し元に返る
end
puts area #メソッド呼び出し areaが【戻り値】の4になるのでputs 4になる

 

こんな感じで書ける。やっぱり分かれてるほうが直感的にわかりやすいなぁって思うのは僕だけでしょうか。たぶんそうじゃない場合もあるのかもしれない。戻り値!戻り値!戻り値だ!Newbieは戻り値とか引数とか言われるとこんがらがってくるけど、落ち着いて考えれば問題ないぜ。

 

ちなみに戻り値は変数に代入することもできる。変数に名札つけれちゃうって感じだね。

 

def area
    2 * 2  
end
fuck = area
puts fuck

 

こんな感じだね。変数名が投げやりになってきてるのは気にしない。なんで変数fackに代入する必要があるんだろ?って思うじゃん。代入することでareaメソッドの計算結果を使って別の計算したり、他のところでも使えるようになるってこと。そういうこと。そういうことだ。

 

引数を使ってオブジェクトを渡せるメソッド

でたー引数!

 

def area(x)
    x * x
end
puts area(2)

 

怯えるな…。簡単だ…。area(x)のxは変数だ。area(2)の2が引数だ。puts area(2)で2がdef area(x)のxに代入されるんだ。で、メソッドの中でx * xだから2 * 2になるんだ。とても簡単だ。「引数」とか「渡す」とか出てくると混乱してくる人も居ると思うんだけど、変数に代入してるって考えると簡単だ。

 

ちなみに2つ以上の引数を持つメソッドも定義できる…

 

2つ以上だって… ややこしくなってきた…って思うじゃん。簡単だ。

 

def area(tateyoko)
    tate * yoko
end
puts area(23)

 

な?簡単だろ。area(tate, yoko)のtateとyokoは変数なので好きに書いて大丈夫。puts area(2, 3)の2がtateに、3がyokoにそれぞれ代入されるんだよね。で、tate * yokoで6が戻り値として返る。で、見ての通りなんだけど引数の個数はメソッドの定義側と呼び出し元で同数にしてあげる必要があるよって感じ。3つ以上にもできる。もちろん同数ね。

 

 

returnでメソッドを途中で終わらせる

 

def store_clerk_good(x)
    respons = "は〜い"
    unless x
        return respons
    end
    respons + "ありがとう!"
end
puts store_clerk_good(false)
puts store_clerk_good(true)

 

 

returnを書いてあげると、returnから下は実行されないんだよね。上のメソッドだとrespons + "ありがとう!"が実行されない感じね。で、return 変数responsになってるんだけど、returnは後に続くオブジェクトを戻り値にするから、この場合は代入されてる"は〜い"が戻り値になるね。このプログラムはレジの店員さんがいい感じ(true)だったら"ありがとう!"も言っちゃうし、よくない感じ(false)だったらreturnで"は〜い"だけで終わる感じにしてみたよ!

 

そんな感じで今日も振りかえってみました!

 

なんとなく自分で場面を想像してコードを少しだけ書き換えるってだけでも結構面白かったりするね!

 

ってことでアディオス!続きは明日!

 

 

 

 

 

 

独学者とか初学者はまずは言語のコミュニティでいいんじゃないかなって

f:id:kkouji0224:20191026210102p:plain

ruby-jp.github.io

 

こんばんは。つい先日までTwitter上ではオンラインのプログラミングスクールのネタでお祭り騒ぎでしたね。で、いまさっきも元生徒さんかな?のツイートが流れてきて何だか切ない気持ちになったので何となく書いてみます。

まず大前提としてスクールとかを全然否定するつもりはまったくありません。その人その人にとって今必要なものが目の前に現れると思ってます。

 

コミュニティはスクールやオンラインのサロンだけじゃないよね

どうしても独学だったり初学者って右も左もわからないよね。なので自分なりに検索してみたり、SNSで調べてみたりしてるうちに見付けた丁度いい感じのものとかを選ぶのかなぁって感じなんだと思う。

 でも、もっとシンプルなところにコミュニティがあったりするんだよね。冒頭に貼ってあるリンクはruby-jpっていうslackのコミュニティね。newbieに優しくマサカリが飛んでこないように運営されてる。あと個人的に興味があったのでrubyメーリングリストってのにも入ってみたりとか。

 Rubyに限らずPHPでもJSでも使ってる人が多い言語にはコミュニティってあると思うので、まずはそこを見てみることから始めてもいいんじゃないかなって気がする。

 よくリファレンスを読もうぜって言われるじゃん。それと同じようにコミュニティも言語ごとに大きなコミュニティがあるからまずはそこから覗いてみるのが素直な流れなのかもなって。

 

僕自身はslackとかに入っててもほぼ発言とか質問しないんだけど、それでもやっぱり何か困ったことあったら聞けるしなぁって安心感があるよね。

 

そんな感じでなんとなく短いけど書きたくなったので書いてみました〜。

 

Ruby超入門 2周目 CHAPTER 6-3 ハッシュの要素を 繰り返し処理する まで

f:id:kkouji0224:20191025224143p:plain

 

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

 ※上の画像はRuby超入門に出てくるハッシュオブジェクトさん

 

はい。こんにちは。眠くてなかなか目が覚めないよ。koujiです。

 

今日は昨日眠くて唐突に分割してしまった、ハッシュの続きを振り返っていきまーす。

 

ハッシュにキーと値を追加

drinks = {cola: 130redbull: 250monster: 300}
drinks[:maca= 350
p drinks

 

こんな感じ。ハッシュの中にコーラもレッドブルもモンスターもあるけど、いまいち刺激が足りねーぜ!!マカがないマカを追加しよう!!そんな時は…

 

変数名[:シンボル] = 値

 

こうやって書いてあげるとdrinksハッシュにマカが追加される!!一番みなぎってくるのはマカのドリンクだと信じて疑いません。

 

で、例えばハッシュの中にすでにコーラあるのにdrinks[:cola] = 400って書いてあげる。きっと名前は同じだけどお高いコーラなのだろう。そうするとキーが後から追加したものに上書きされるんだ。高いコーラってのを飲んでみたいものだ。

 

存在しないキーを指定したとき

drinks = {cola: 130redbull: 250monster: 300}
p drinks[:suppon]

 

てか、マカじゃなくてスッポンエキスなかったっけ?と存在しないsupponを取得しようとすると… nilが取得されるんだね。

 

ちなみに存在しないキーを指定したときの値を指定することもできる。

 

drinks = {cola: 130redbull: 250monster: 300}
drinks.default = "専門店へ行ってこい"
p drinks[:suppon]

 

drink.default = 値 を書いてあげるとハッシュの中に存在しないキーが指定されたときの値を指定できる。なので上の場合だと、さすがにスッポンエキスねーよ!そんなものはない!ってことなのでハッシュに存在なんかするわけないので"専門店へ行ってこい”になるのだ。

 

2つのハッシュを1つにまとめる

 

drinks = {cola: 130redbull: 250monster: 300}
alcohol = {sake: 500wine: 900beer: 500}
drunk = drinks.merge(alcohol)
drunk.default = "専門店へ行ってこい"
p drunk[:suppon]

 

普通のドリンク以外にも酒だ酒もってこい!!に対応するために、まずalcoholハッシュを作りまーす。で、もう一つのdrinksハッシュとガッチャンコするには…

 

ハッシュは全部変数に代入してるので

 

drinksハッシュ.merge(alcoholハッシュ)って書いてあげると1つにまとめられちゃうね。で、さっきみたいにdefault設定しておくと酔っ払いがしつこくスッポンを求めてきても「専門店へ行ってこい」となるんだねー。便利。

 

 

ハッシュの繰り返し処理

drinks = {cola: 130redbull: 250monster: 300}
alcohol = {sake: 500wine: 900beer: 500}
drunk = drinks.merge(alcohol)
drunk.each do |keyvalue|
    puts "#{key}#{value}円だって言ってんだろゴルァ!"
end

 

さっきマージして作ったdrunkに.each do なんだけど配列のときと違って変数が2つになってるね。|key, value|のkeyの方にはシンボルオブジェクトが代入されて、valueの方には値が代入されてる感じだね。で、それをハッシュの中身全部に繰り返すって感じ。

これで泥酔した客にも繰り返し#{key}は#{value}円だって言ってんだろゴルァ!って繰り返し伝えられるようになったぜ。

 

練習問題

※ネタバレ注意なので練習問題楽しみたい人は見ないでください

 

問 1 のハッシュ menu で、キー :tea に対応する値がなければ " 紅茶はありませんか? "
と表示してください

menu = {coffee: 300caffe_latte: 400}
puts "紅茶はありませんか?" unless menu[:tea]

 

これが面白いなーって思ったんだよね。これunless使ってて.defaultで指定してあげるのじゃダメなのかなぁ?って思ったんだけど、上の場合だと、こっちからtea指定して、こっちから「紅茶ねーのか?」って聞いてるイメージだよね。

 

で、上の方で書いたdefaultのsupponだと、こっちがスッポンエキスよこせよ!にたいして、向こうから「専門店へ行ってこい」って言われてるイメージ。よくわかんないけど、そういうイメージというか流れっていうか、そんなものでも書き方かわってくるのかもしれないなーって思ったり思わなかったり。

 

ってな感じでCHAPTER 6はここまで!

 

ハッシュもなかなかおもしろかったぜ!ちなみにこのCHAPTER 6の練習問題は高度なやつがあって難しかった…

 

ということで、またそのうち〜!

Ruby超入門 2周目 CHAPTER 6-1 オブジェクトを組で扱う まで

f:id:kkouji0224:20191025224143p:plain

 

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

 ※上の画像はRuby超入門に出てくるハッシュオブジェクトさん

はーい豪雨でしたね。そして寒いのでこんな時間に珍しくコーヒー飲んでます。

こんばんは。koujiです。

 

今日はCHAPTER 6のハッシュのところを振り返っていきたいと思いまっす!

 

{:coffee => 300:caffe_latte => 400}

 

上がハッシュ。配列と同じように複数のオブジェクトをまとめることができるんだけど、配列との違いは、キーと値のセットで扱えるって感じ。配列もオブジェクトだったようにハッシュもオブジェクト!配列はArrayオブジェクトで、ハッシュはHashオブジェクトだね。ハッシュのキーと値にはどんなオブジェクト書けちゃう。ちなみに => これはハッシュロケットって言うらしい。なんかやんちゃな名前。

 

で、ハッシュをそのままpメソッドに渡そうとするとエラーになっちゃうみたいなので試してみたら下のエラーになちゃった。

 

syntax error, unexpected =>, expecting '}'
p {:coffee => 300, :caffe_latte => 400}

 

予期しないシンタックスエラーって感じなのかな。()でハッシュを囲んであげるとこのエラーがでなくなるので忘れないようにしないとね。

 

Symbolオブジェクト

{:coffee => 300:caffe_latte => 400}

 

上のハッシュの「:coffee」と「:caffe_latte」がシンボルオブジェクト

シンボルは文字列と似てるオブジェクトで、配列のときはダブルクォーテーションで囲ってたけど、ハッシュでは先頭に:(コロン)をつけて書いてあげるようにする。

 

で、このシンボルオブジェクトはメソッドで文字列にできたり、逆に文字列をシンボルにできちゃったりする。

 

p "samusugiru".to_sym #=> :samusugiru
p :samusugiru.to_s #=> "samusugiru"

 

こんな感じね。.to_symと.to_sだね!

 

ハッシュの書き方は2種類ある

①{:coffee => 300:caffe_latte => 400} #コロンが先頭でハッシュロケットを使う
②{coffee: 300caffe_latte: 400} #コロンが後でハッシュロケットなしで値を書く

 

②の方が直感的にわかるので主流な書き方っぽい!

で、コロンが後ろにきた書き方なんだけど、pメソッドに渡してあげると…

コロンが先頭にきてハッシュロケット使ったものが端末に表示されるから面白い。

 

ハッシュを変数に代入

menu = {:coffee => 300:caffe_latte => 400}
p menu

 

ハッシュも変数に代入できまーす!ハッシュに名札をつけるイメージとのこと。代入っていうと、なんか入れてあげる感じだけど、どうやらそうじゃなくて名札とかラベルをつけてあげるイメージらしいんだよね。この辺ちょっとよくわかんないんだけど、そのうち調べてみようかなって感じです。

 

ハッシュから値を取得する

menu = {:coffee => 300:caffe_latte => 400}
p menu[:coffee]

 

これも簡単で、変数名[シンボルオブジェクト]って感じだね。この場合だと変数名menuにシンボルの:coffeeにしてあげると値の300が取得できるって感じ。シンボルは先頭に:コロンをつける!

 

で、COLUMNに配列が入ってるハッシュってのが紹介されてて面白かったんだよね。

 

{title: "Ruby Book"members: ["yano""beco"]}

 

こんな感じのハッシュが書かれてたんだけど、上の値の取得で配列を取得して、以前教えてもらった.mapとかいけるんでは?と思ってやってみたの。こんな感じ。

 

menu = {title: "Ruby Book"members: ["yano""beco"]}
members = menu[:members].map { |x|  x.upcase }
p members #=> ["YANO", "BECO"]

 

とりあえずハッシュを変数menuに代入したら、うえでやったようにmenu[:members]で配列を取得して、.mapで変数xに配列を一個ずつ入れると文字列オブジェクとになるので、それに.upcaseで大文字にしてあげて変数membersにみたいな感じ。ちゃんと大文字になって感動ですよ!!ねー。面白いよねー。こういうの面白いよ!

 

 

てか、CHAPTER 6の分の振り返りを一回で終わらせようと思ったけど、疲れてきたので分割するよっ!苦行になってもしかたないしね…

 

そんな感じで続きは明日!