Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rubyについてあれこれ / About Ruby

Rubyについてあれこれ / About Ruby

Nagano.rb #2 で発表したスライド

とみたまさひろ

July 20, 2019
Tweet

More Decks by とみたまさひろ

Other Decks in Technology

Transcript

  1. RubyKaigi 2020 RubyKaigi 2020 4/9 - 11 松本市で開催 ㊗ 松本市で開催

    ㊗ 初の県庁所在地以外開催 https://rubykaigi.org/2020 13
  2. RubyKaigi 2020 RubyKaigi 2020 4/9 - 11 松本市で開催 ㊗ 松本市で開催

    ㊗ 初の県庁所在地以外開催 長野市涙目 (;_;) https://rubykaigi.org/2020 13
  3. インタプリタ インタプリタ 文法エラーがあっても途中まで実行される echo 123 echo 456 > # error

    echo 789 % bash hoge.sh 123 hoge.sh: 行 3: 予期しないトークン `newline' 周辺に構文エラーがあります hoge.sh: 行 3: `echo 456 > # error' 19
  4. Rubyはコンパイルしてから実行 Rubyはコンパイルしてから実行 文法エラーがあったら実行されない p 123 p 456 _ # error

    p 789 % ruby hoge.rb hoge.rb:2: syntax error, unexpected tIDENTIFIER, expecting end- p 456 _ # error 20
  5. Rubyプログラムの例 Rubyプログラムの例 # クラス定義 class Hoge # 初期化 def initialize(arg)

    @arg = arg # インスタンス変数に引数を記憶 end # 初期化時に渡された引数を表示 def fuga puts @arg end end hoge = Hoge.new("abc") # Hogeクラスのオブジェクト生成 hoge.fuga # "abc"が出力される 24
  6. Rubyでは値はすべてがオブジェクト Rubyでは値はすべてがオブジェクト 数値 / 文字列 / シンボル / 配列 ture

    / false / nil 等々 オブジェクトではない基本型(プリミティブ型) というものは無い 27
  7. クラスを調べる クラスを調べる 123.class #=> Integer "Hoge".class #=> String :sym.class #=>

    Symbol [1,2,3].class #=> Array true.class #=> TrueClass false.class #=> FalseClass nil.class #=> NilClass 29
  8. ブロック ブロック # 各要素に対して繰り返し array.each do |e| ... end #

    指定回数繰り返し 5.times do |i| ... end # ブロック終了時にファイルをクローズ File.open("filename.txt") do |f| f.read ... end 35
  9. ブロックを受け取る側 ブロックを受け取る側 def each yield(x) # ブロックを引数xで実行 end # ブロックをオブジェクトとして受け取る

    def each(&block) block.call(x) # ブロックを引数xで実行 sub(&block) # 他のメソッドに渡す block.class #=> Proc end 36
  10. Procオブジェクトの作成 Procオブジェクトの作成 a = proc{|a, b| ... } # 引数省略可

    b = lambda{|a, b| ... } # 引数省略不可 c = ->(a, b){ ... } # lambda{|a, b| ... } と同じ 5.times(&a) 37
  11. class Integer alias orig_plus + def +(other) if rand >

    0.5 self.orig_plus(other) else self * other end end end 5 + 10 #=> 15 5 + 10 #=> 50 5 + 10 #=> 15 5 + 10 #=> 15 5 + 10 #=> 50 42
  12. メソッドが見つからなかった時に動くメソッド メソッドが見つからなかった時に動くメソッド class Hoge def method_missing(name, *args) super if name

    == :hoge # hogeメソッドはエラー puts "#{name} が引数 #{args.inspect} で呼ばれた" end end Hoge.new.fuga(1, 2, 3) #=> fuga が引数 [1, 2, 3] で呼ばれた Hoge.new.hoge #=> NoMethodError (undefined method `hoge' for #<Hoge: 44
  13. 「やり方はひとつじゃない」 「やり方はひとつじゃない」 TMTOWTDI There’s More Than One Way To Do

    It. Perlのスローガン 同じことをするのに複数の方法がある Rubyで明に言われているわけではない 49