Progate Ruby

Rubyの開発環境を用意しよう!

windowsOS

ruby -v
echo puts 1 + 2 > fuga.rb
ruby fuga.rb

macOS

# macOS には標準でインストールされている
ruby -v

# homebrew はインストール済みの前提
rbenv -v # command not found なはず
brew install rbenv ruby-build
rbenv -v

echo $SHELL
## /bin/bash の場合
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
## /bin/zsh の場合
echo 'eval "$(rbenv init -)"' >>  ~/.zshrc
source ~/.zshrc

rbenv install --list
rbenv install 2.7.1
rbenv versions
rbenv global 2.7.1
ruby -v

Ruby I

  • Python との共通点
    • 文末セミコロンなし
    • 文字列のクォーテーションはどちらでも可
    • コメントは #
    • 四則演算の記号
    • + による文字列の連結
      • ただし, 数値と文字列を連結することはできない。(->#{}を使う)
    • 変数名 = 値 による変数定義
    • 変数は snake_case
    • 比較演算子, (複合)代入演算子
  • Python との相違点
    • 13/4 -> 3
    • コーディング規約の例: https://shugo.net/ruby-codeconv/codeconv.html
    • 文字列中での変数展開: #{変数名} を文字列に入れる (ダブルクォーテーションの場合のみ)
    • if文の記述(動きはPythonと同じ)
    • true, false (Python は True, False)
    • puts のようなメソッドの括弧は省略可能(省略しなくてもよい)
if a > 1  # 後ろに : はつけない
    puts "a>1"  # インデントは 2つのスペース を推奨(インデント自体必須ではない)
elsif a < 0  # elif でも, elseif でもない
    puts "a<1" 
else
    puts "a==1"
end  # end で閉じる
  • 論理演算に関して
    • and, &&, or, || がある
    • 違いは優先度のみ (&&>=>and)
    • 評価値はオペランドの一方(JavaScriptと同じ)
      • A && B で A が偽なら A そのもの, A が真なら B そのものを返す。

Ruby II

  • Python との共通点
    • 配列: numbers = ["A","B","C"][] によるアクセス
  • Python との相違点

    • ハッシュ: info = {"name" => "hoge", "age" => 23}
      • アクセス, 要素の追加, 更新などは同じ
        • 存在しない要素へのアクセスは nil となる
          • nilputs で表示されない。
          • nil の評価は false
      • キーをシンボルとすることもできる。(:name)
        • シンボルは文字列に似ているが, 互換性はない
        • キーにシンボルを用いるとき, :name => "hoge"name: "hoge" と書ける
          • このときも info[:name]
  • 表示メソッド

    • puts: 引数が配列のとき各要素を出力(要素ごとに改行される)。引数が文字列のとき文字列はクォートで囲まれない。
    • print: 引数が配列のとき配列として出力。引数が文字列のとき文字列はクォートで囲まれない。
    • p: 引数が配列のとき配列として出力。引数が文字列のとき文字列はクォートで囲まれる。
items.each do |item| # 配列 items の各要素を item に格納しながらループ
    puts item
end

Ruby III

def method1  # ruby のメソッドはいわゆる関数
  puts "hoge"
end  # endつける
method1  # 引数無しのメソッド呼び出しの() はなくても分かるので普通省略する

def method2(arg1)
  puts "#{arg1}です"
  return arg1
end
  • 真偽値を返すメソッド名は慣用的に isEmpty ではなく empty? とする
  • キーワード引数(呼び出し順序は不問になる)
def method3(a,b: 3)  # b のデフォルト値は 3(デフォルト値は省略可能。b: とする。(:b ではない))
    return a + b  # ここでは :b ではなく b
end
method3(2, b: 4)  # 呼び出しはシンボルとして
method3(2, :b => 4)  # なので, これも可

Ruby IV

class Hoge
  attr_accessor :name  # name はインスタンス変数
  def initialize(name)  # コンストラクタ(キーワード引数を用いてもよい)
    self.name = name  # this ではない
  end
  def getName  # インスタンスメソッド
    return self.name
  end
end
hoge = Hoge.new("fuga") # インスタンス生成
puts hoge.name
puts hoge.getName
  • require "ファイルパス" ファイルパスは拡張子省略
  • gets.chomp入力を文字列として受け付ける
a = gets.chomp.to_i  # to_i は整数に変換するメソッド

Ruby V

  • 継承 class 子クラス < 親クラス
    • オーバーライドの動作は同じ
    • オーバーライドしたメソッドの中で super メソッドを呼び出すと親クラスの同名のメソッドとされる。(super には必要なら実引数を渡す)
  • ライブラリの利用
require "date"
date = Date.new(2020,5,29)
puts date  # 2020-05-29
if date.sunday?  # デフォルトで用意されているメソッド
today = Date.today  # today はクラスメソッド
  • インスタンスメソッドの定義: def method
  • クラスメソッドの定義: def Hoge.method (自身のクラス名をつける)
    • 呼び出しも Hoge.method とする。(クラス内のインスタンスメソッドからも呼び出せる)
  • インスタンス変数の定義: attr_accessor :var
  • クラスインスタンス変数の定義: @var (親クラスからは参照できない)
  • クラス変数の定義: @@var (継承されたサブクラスでも参照できる)