Ruby社内勉強会 第1回


概要

単なる社内勉強会の記録ですが、Ruby初学者の参考になるかもしれないので内容を公開します。
今回は1回目です。

背景

進め方

  • Rubyがミニツクをみんなで見ながら、講師(私)が内容の説明を行う
  • 全員Javaはわかるので、Javaとあまり変わらない箇所などは適宜スキップする
  • WindowsのPCを使用する
  • 1回の開催で1時間ほど
  • 動画、ドリル、演習はスキップする

注意事項

本記事のサンプルコードは全部を網羅していないため、適宜元サイトも参照してください。

学んだ内容

ミニツクで学んだ範囲

「1. Hello, Ruby!」から「3. 便利なオブジェクト」の「配列」まで

詳細

環境構築

  • こちらを参考にインストールを実施
  • 今回はRubyInstaller DEVKITなしをインストール

Hello, Ruby!

  • putsメソッドで標準出力へ文字列を出す
    • カッコは省略してもいい。むしろ、putsメソッドの場合は省略することのほうが多い
puts "Hello, Ruby!"  # => Hello, Ruby!
  • rubyコマンドでファイルを指定すると実行できる
    • rubyコマンドなしでも動作する? -> おそらくインストール時に.rbファイルへの関連付けを行う設定にすれば直接実行できる
  • REPLあり(irb)
    • irb上でputsを実行すると、「nil」と表示された
      • putsの戻り値がnilであるため
      • nilはJavaでいうnullと同等
  • -e 指定の実行はワンライナーのため

端末に表示する

  • printメソッドは改行を出力しない
    • printメソッドで改行するなら「\n」を使う
    • その場合、文字列は''ではなく""で囲う
  • pメソッドで、人にわかりやすい表示になる
    • Stringの場合は""で囲われた値が出るなど
    • pメソッドはnilではない戻り値がある
  • Stringリテラルを生成する際の違いとして、""は\nのようなバックスラッシュ記法を使える(特殊な文字として認識される)が、''の場合はそのままの文字列として表示される
  • 変数は型がなく、何でも代入できる。宣言なしでいきなり代入式を書ける
    • 変数.class で、代入されている値が何の型か調べることが可能

四則演算

  • 算術演算子は動作的にはJavaと同じ
    • Rubyの演算子は、実はメソッドであるという話もあるが、それは追い追い学んでいく

変数

  • ""で囲う文字列の中に#{変数名}があると、変数の内容が出力される

ifによる分岐

  • 当然Rubyにもifがあり、動作としてはJavaと同様だが書き方が違う
    • 条件式にカッコはつけない
    • {}ではなくthen endで囲う(thenは省略してもいい)
    • 真偽の判定はJavaと全然違う
      • falseとnilが偽、それ以外は全部真
    • Javaでいうelse、else ifももちろんあるが、else ifは「elsif」と表記する
      • 他の言語ではあまり見かけない表記
      • コメントにて指摘あり。Perlなど、elsifという記法を用いる言語は他にも存在する
flag = true
if flag == true then
    p "true"   # => "true"
end
flag = 0
if flag
    p "true"   # => "true"
end

whileでの繰り返し

  • 動作的にはJavaと同様だが書き方が違う
    • 条件式にカッコはつけない
    • {} ではなくdo endで囲う(doは省略してもいい)
    • 真偽の判定はif文と同じ
  • 余談だが、Javaとは違ってインクリメント、デクリメントはない(Pythonと同様)
  • for文はなくもないが、あまり使われない
    • Javaでいうなら拡張for文に相当する
  • breakなどはあるが、そのうち学習する

メソッド定義

  • メソッド定義の書式はJavaとはかなり違う
    • defキーワードを使う
    • 引数がなければ()は書かない。引数があるとしても型は書かない
    • 戻り値の型は書かない
    • 最後に評価された値が戻り値として返る。return文もあるが省略してもいい
      • Rubyのメソッドには戻り値は必ずある(なさそうな場合でもnilが返っている)
  • putsと同様、メソッド呼び出し時は()を省略可能。特に引数がない場合は大抵省略する
  • メソッドの引数にはデフォルト値を設定可能
def greeting
    puts 'Hello, Ruby!'
end

greeting   # => Hello, Ruby!
greeting   # => Hello, Ruby!

def example(args1, args2 = 3)
    args1 + args2
end

p example(1)   # => 4

日本語の取り扱い

  • 常にUTF-8を使えばいいこととしてスキップ

文字コード指定による動作の違い

  • 常にUTF-8を使えばいいこととしてスキップ

文字列

  • 式展開(#{})は変数に対してだけでなく算術演算などについても使える

正規表現

  • //で囲うことで正規表現オブジェクトを生成できる
  • 文字列とのマッチングには=~演算子を使う
    • マッチしたら位置を示す数値、マッチしなかったらnilが返る
    • falseとnilのみが偽というRubyの仕様があるため、=~の結果はそのままif文で使える

配列

  • []で囲って、要素ごとにカンマ区切りで配列オブジェクトを生成する
  • 配列の個別の要素を参照する書き方はJavaと同じで[]を付けて0から始まる添え字を指定する
  • 要素数の取得もJavaと同じでlengthを使う
    • Rubyの場合は、[]もlengthも実はメソッドという話はあるが
  • 配列の要素を一つずつ列挙してループするにはeachメソッドを使う
    • 繰り返したい処理は、ブロックという処理の塊を渡せる仕組みを使う
    • Rubyであまりfor文が使われない理由がこれ
["foo", "bar", "baz"].each do |n|
  puts n
end
# => foo
# => bar
# => baz
  • 数値を1ずつ増やしてループするような、Javaのfor文に相当する書き方をしたければどうするか?そういう配列を用意しなければならないか?
    • 下記のような書き方で可能
      • (0..5)のような記法でRangeオブジェクトを生成することができ、それに対してeachメソッドを呼ぶ
      • 5.timesのような記法で、それに対してブロックを渡す(この場合は0から4になるが)
(0..5).each do |i|
    puts i
end
# => 0
# => 1
# => 2
# => 3
# => 4
# => 5
5.times do |i|
    puts i
end
# => 0
# => 1
# => 2
# => 3
# => 4
5.times do
    puts 'aaa'
end
# => aaa
# => aaa
# => aaa
# => aaa
# => aaa

次回