#三項演算子(条件演算子)
? trueの時の処理:falseの時の処理
#Case構文
case 対象のオブジェクトや式
when 値1
#値1の場合の処理 then
when 値2 then #値2が真だった場合の処理(thenを使うと一行で済む)
else
#どれにも一致しない場合の処理
end
・最後に評価された式が戻り値になるので、結果を変数にいれることも可能
・whenの後の値には、:japanなどのハッシュでも可。
#クラス
class クラス名(最初の文字は大文字。キャメルケース)
end
・Rubyでは単一継承を採用しているため、一つのクラスは一つのスーパークラスしか持てない。
・クラスでモジュールをincludeすると、モジュールで定義したメソッドがインスタンスメソッドとして呼び出せるようになる。
・モジュールをクラスにincludeやextendして機能追加することをミックスインといい、これで多重継承と似た仕組みを実現できる。includeはインスタンスメソッド、extendは特異メソッド(クラスメソッド)として呼び出しが可能なので、クラス構文直下で呼び出したい時はextend。
・クラスはclassクラスのインスタンス(オブジェクト)。Objectクラスを継承するModuleクラスを継承している。
#####・includeしたモジュールの確認方法
> User.include?(モジュール名)
=> #true or falseが返る
> User.included_module
=> [Kernel] #includeされているモジュールが配列で返る
> User.ancestors
=> [Bank, Object, Kernel, BasicObject] #モジュールとスーパークラスが返る
#モジュール
module モジュール名
モジュールの定義。メソッドや定数など
end
・クラスと違いモジュールからインスタンスは作成不可。(user = User.newでエラーが出る)
・他のモジュールやクラスは継承不可。is-aの関係が成り立たないので継承はできないが、共通機能はもたせたい..という時に使用する。
・クラスでミックスインする場合は、publicにする必要がない場合は、モジュール側でprivateにしておくと良き。
・モジュールのselfはinclude先のインスタンスになる為、includeされた先のクラスにpriceメソッドがあればモジュール側でもpriceが呼び出せる
・Rubyでいつでもputsやloopメソッドなどが使えるのは、実質全クラス頂点のObjectクラスがKarnelモジュールをincludeしている為。(Karnelモジュールの中身)
・モジュールはmoduleクラスのインスタンス。Objectクラスを継承している。
#例外処理
begin
#例外が起き得る処理
rescue
#例外が発生した場合の処理
end
begin
#例外が起き得る処理
(#例外が発生しなかった場合の処理をここに書いてもいいのでelseは不要な場合が多い)
(rescue)
(#例外が発生した場合の処理。)
(else)
#例外が発生しなかった場合の処理
(ensure)
#例外の有無に関わらず必ず実行する処理
end
・rescueは必須ではない。異常終了してもいいが、終了する前にやりたい処理がある場合などはensureだけでも可
・ただし、openメソッドにブロックを渡したりなど、「使用したら必ずソースを解放する」などの場合はブロック付きメソッドを使うことで自動処理できる場合が多い為、ensureメソッドの出番は少ないかも。
def メソッド名
case object
when :japan
'yen'
when :us
'dollar'
else
raise "エラーメッセージ"
#=> RuntimeError: "エラーメッセージ"
#特に何も指定しないとRuntimeErrorが呼び出される。
end
end
・RuntimeError以外を呼び出したい場合は、以下参照
① raise ArgumentError, "エラーメッセージ"
② raise ArgumentError.new("エラーメッセージ")
#ブロック
処理の塊。Procでブロックをオブジェクト化できる
Rubyではメソッドを呼び出す際にブロックを使用できる。
#メソッドまとめ
1 | 2 |
---|---|
chomp | 改行文字を削除 |
scan | |
message | |
size(length) | |
open | |
inject | |
reject | |
brock.given? | ブロックが渡されている場合にtrueを返す |