Ruby リファレンスを読んだのでメモ

/

from Qiita: Rubyリファレンスを読んでの、メモ

字句構造

予約語

エスケープ方法はあるが、使わない方が身のため。

undefined
1
BEGIN class ensure nil self when
2
END def false not super while
3
alias defined? for or then yield
4
and do if redo true __LINE__
5
begin else in rescue undef __FILE__
6
break elsif module retry unless __ENCODING__
7
case end next return until

変数と定数

クラス変数@@

@@で始まる変数はクラス変数。親クラスに、子クラスですでに定義されている同名のクラス変数を追加したら、 子クラスのクラス変数が上書きされる。

undefined
1
class Foo
2
end
3
class Bar < Foo
4
@@v = :bar
5
end
6
class Foo
7
@@v = :foo
8
end
9
class Bar
10
p @@v #=> :foo
11
end

定数

  • アルファベット大文字で始まる
  • 定義されている定数に代入しようとすると、警告を出すが、代入される
  • クラス定義の外(トッ プレベル)で定義された定数は Object に所属する
    • あるクラスまたはモジュールで定義された定数を外部から参照するためには :: 演算子を用いる
    • Object クラスで定義の定数(トップレベルの定数と言う)を確実に参照するには左辺無し
undefined
1
module M
2
I = 35
3
class C
4
end
5
end
6
p M::I #=> 35
7
p M::C #=> M::C
8
p ::M #=> M
9
10
M::NewConst = 777 # => 777

リテラル

バックスラッシュ記法

文字列中でバックスラッシュの後に記述する文字によって、意味を持たせる事ができます。

  • \t タブ(0×09)
  • \v 垂直タブ(0×0b)
  • \n 改行(0×0a)
  • \e エスケープ (0×1b)
  • \s 空白 (0×20)
  • \nnn 8 進数表記 (n は 0-7)
  • \xnn 16 進数表記 (n は 0-9,a-f)

%記法

バックスラッシュの数をコードから減らす効果。配列式では、文字列の配列やシンボルの配列を簡単に表現できる

  • %!STRING! または %Q!STRING!: ダブルクォート文字列
  • %q!STRING! : シングルクォート文字列
  • %w!STRING! : 要素が文字列の配列(空白区切り)
undefined
1
%w(foo bar bazz)
2
== ['foo', 'bar', 'baz']
  • %W!STRING! : 要素が文字列の配列(空白区切り)。式展開、バックスラッシュ記法が有効
undefined
1
v = "c d"
2
%W(a\ b #{v}e\sf #{})
3
=> ["a b", "c de f", ""]
  • %s!STRING! : シンボル。式展開、バックスラッシュ記法は無効
  • %i!STRING! : 要素がシンボルの配列(空白区切り)
  • %I!STRING! : 要素がシンボルの配列(空白区切り)。式展開、バックスラッシュ記法が有効

演算子

優先順位

&& > || > and or

undefined
1
a && b || c #=> (a && b) || c
2
a || b && c #=> a || (b && c)

再定義できない演算子

undefined
1
= ?: .. ... not && and || or ::

多重代入

undefined
1
foo, bar = [1, 2] # foo = 1; bar = 2
2
foo, bar = 1, 2 # foo = 1; bar = 2
3
foo, bar = 1 # foo = 1; bar = nil
4
5
foo, bar, baz = 1, 2 # foo = 1; bar = 2; baz = nil
6
foo, bar = 1, 2, 3 # foo = 1; bar = 2
7
foo = 1, 2, 3 # foo = [1, 2, 3]
8
*foo = 1, 2, 3 # foo = [1, 2, 3]
9
foo,*bar = 1, 2, 3 # foo = 1; bar = [2, 3]
10
# 左辺の最後の式の直前に * がついていると、対応する 左辺のない余った要素が配列として代入

&&と||

  • && :左辺を評価し、結果が偽なら、その値(つまり nil か false) を返す。左辺の評価結果が真なら、右辺を評価しその結果を返す
  • || :左辺を評価し、結果が真なら、その値を返す。左辺の評価結果が偽なら、右辺を評価しその評価結果を返す

条件演算子

undefined
1
式1 ? 式2 : 式3
2
# 上と下は同じ
3
if 式1 then 式2 else 式3 end
4
# 例
5
x = 123456789
6
x%3 == 0 if "3x" : "hazure"
7
=> 3x

制御構造

unless

unless は if と反対で、条件式が偽の時に then 次の式を評価。elsif を指定できない。

制御構造(ifなど)の修飾子

式 if 式の様に、一行で書くやつ。 右辺の条件が真/偽の時に、左辺の式を評価してその結果を返す。

retry

rescue 節で begin 式からもう一度実行するのに使用。 処理が成功するまで処理を繰り返すようなループを作れる。

undefined
1
begin
2
do_something # exception raised
3
rescue
4
# handles error
5
retry # restart from beginning
6
end
7
# rescue 節以外で retry が用いられた場合にはSyntaxError`

クラス/メソッドの定義

呼び出し制限

  • public : 制限なし
  • private : 関数形式でしか呼び出せない
  • protected : ソッドを持つオブジェクトが self であるコンテキストでのみ呼び出し可能
  • nitialize は定義する場所に関係なく常に private
undefined
1
class Foo
2
def foo
3
p caller.last
4
end
5
protected :foo
6
end

alias

メソッドあるいはグローバル変数に別名をつけます。メソッド名には識別子そのものかリテラル/シンボルを指定

undefined
1
# alias 新メソッド名 旧メソッド名
2
# alias 新グローバル変数名 旧グローバル変数名
3
alias foo bar
4
alias :foo :bar
5
alias $MATCH $&

undef メソッド名

メソッドの定義を取り消す

defined? 式

式が定義されていなければ、偽を返す。定義されていれば式の種別を表す文字列を返す