Contents
基本文法
Hello World
print(“Hello World\n”)
基本ファイル構成
コメント
# comment
変数
共通単値変数
- 宣言
宣言は不要
- 代入
val=newVal
- 参照
val
数値
数値リテラルは自動的にオブジェクトに変換される。
整数は通常はFixnumクラスのインスタンスとなる。
文字列
- 通常文字列
str = "string"
or
str = 'string'
”を使用すると\\と\’以外はエスケープされない。
なお、文字列中に #{<式>} のように記述することで、式が評価された後、文字列が組み込まれる。
これによって、変数を文字列中で展開することができる。
- シンボル
:<文字列>
この記法はシンボルと呼ばれ、文字列定数として扱われる。
単純な文字列と異なり、同じ内容のシンボルは何度生成してもグローバルで同じ存在となる。
文字列の先頭に : をつけることでシンボルとなるが、 “” で囲まれた文字列は中身のみシンボルとなり、スペースを含む場合に使用できる。
また、シンボル内の変数は展開される。
真偽値
true、falseがそのまま使える
if true puts("true") end if false else puts("false") end if !false puts("false") end
順序配列
- 宣言
array = ["n1", "n2", "n3"]
もしくは
array = %w{n1 n2 n3}
- 後方追加
array << newElm
- 代入
array[i] = newElm
- 配列長
array.length
- 参照
print array[i]
連想配列
- 宣言
hash={:a=>1, :b=>2}
- 代入
hash[:c] = 3
- 存在確認
- 参照
hash[:a]
- 順序参照
算術演算
3+3 3-3 3*3 3/3 3%3 3**3 # 27 (べき乗)
インクリメント(++)、デクリメント(–)はない。
比較演算
数値・文字列ともに同じ演算子を使用する。
一致
num1 == num2
不一致
num1 != num2
一致・不一致
左項が多きければ正値、等しければ0、小さければ負値がかえされる。
num1 <=> num2
正規表現一致
str =~ /abc/
正規表現不一致
str !~ /abc/
クラス比較
AClass === ainstance右項が左項のクラスに属している場合、trueを返す
OR
||
AND
&&
NOT
!
ビット演算
否定
~2 # -3
左シフト
1 << 2 # 4
右シフト
4 >> 1 # 2
ビット和
1 | 3 # 3
ビット積
5 $ 3 # 1
ビット排他的論理和
1 ^ 3 # 2
検査
読み込み可能
書き込み可能
実行込み可能
存在する
ファイルが存在する
ディレクトリが存在する
サイズが0
サイズが0より大きい
シンボリックリンクが存在する
制御構文
for
for <変数> in <配列オブジェクト> [do] end
for each
Rangeオブジェクトや配列オブジェクトを使用して書く
- Range
(0..10).each{|elm| }
- Array
array.each{|elm| }
while
while 条件 [do] 処理内容 end
条件がfalseであればループを行う場合はuntilを使用する。
until 条件 [do] 処理内容 end
- 短縮形
処理内容 while 条件 処理内容 until 条件
do while
begin 初期処理 end while 条件
条件がfalseであればループを行う場合はuntilを使用する。
begin 初期処理 end until 条件
break
break [戻り値]if文を伴う場合、
break if 条件
戻り値を指定することで、値を返すことができる。
continue
nextif文を伴う場合、
next if 条件
redo
ループにおいて、再度同じ周回を行う
redoif文を伴う場合、
redo if 条件
if
if 条件 実行内容 end
一行に書く場合、thenもしくは:が必要
if 条件 then 実行内容 endor
if 条件 : 実行内容 end更に短縮して、以下のように書くことも出来る。
実行内容 if 条件
unless
if notの場合はunlessを用いる。
unlessの場合、elseしか後続できない。
unless 条件 実行内容 end
if else
if 条件 実行内容 elsif 条件 実行内容 elsif 条件 実行内容 else 実行内容 end
switch case
case num when 1 puts(1) when 2 puts(2) when 3..10 puts("3 - 10") else puts("NO match") end
文字列操作
連結
str << "appended "
部分切り取り
str = "abcde"[0-2]
置換
str = "abcde".gsub("bcd", "234") str = "abcde".gsub(/b[a-z][a-z]/, "234")
分割
- 区切り文字で分割
"a,b,c,d".split(",")
- 正規表現で分割
"a,b,c,d".split(/,/)
クラス
一般的なクラス
class <クラス名> クラス内容定義 end
private / protected化
class定義内で、private/protected宣言の以降に記述したインスタンスメソッドはprivate/protectedメソッドとなる。
class <クラス名> クラス内容定義 protected クラス内容定義 private クラス内容定義 end
クラスメソッドをprivate化する場合、private_class_methodメソッドを使用する
private_class_method(:メソッド名, ...)
変数・定数
- クラス定数
<定数名>=<値>
外部からのアクセス方法
<クラス名>::<定数名>
- クラス変数
@@<変数名>=<値>
- インスタンス変数
@<変数名>=<値>
setter / getterの生成
インスタンス変数に対して、自動でsetterメソッド、getterメソッドを生成できる。
- getterのみ
attr_reader(:変数名, ...)
- setterのみ
attr_writer(:変数名, ...)
- setter / getter
attr_accessor(:変数名, ...)
継承
class <子クラス> < <親クラス> end
メソッド内で、オーバーライド前のメソッドを呼び出す場合はsuperを使用する。
def methodA(x) super(x) end
再定義
宣言したクラスを再度宣言することで、上書きすることができる。
class AClass def methodA return 1 end def methodB return 2 end end class AClass def methodA return 3 end end上記の例の場合、methodAのみ新しい定義で上書きされる。
Module
ほかのクラスに組み込んで使用されるオブジェクトで、多様なクラスに共通の機能を持たせたいときに使う。
継承と違い、複数種類使用することができる。
モジュール内はクラスと同様にメソッドや定数などを宣言できる。
module <モジュール名> end
ほかのクラスで使用する
class AClass include <モジュール名> end
ネームスペースとしての使用
パッケージの概念がないRubyではモジュールをネームスペースとして使用できる。
module AModule class AClass end end module BModule class AClass end end
上記はそれぞれ別のクラスとして利用でき、次のように呼び出す。
aclass = AModule::AClass.new() bclass = BModule::AClass.new()
メソッド
メソッド名にはアルファベットや数値のほか、!と?の記号が末尾に使用できる。
?はブール値を返すメソッド名に使用するのが慣習的である。
!はオブジェクトの内容が破壊される場合に使用するのが慣習的である。
これらの記号がメソッド名に使用されている場合は、呼び出し時に記号は省略できない。
一般的なメソッド
def <メソッド名> (引数...) 処理内容 end
()は省略可能である。
return
returnは省略可能で、省略した場合は、最後に評価された式の結果となる。
つまり
return arg1+arg2は以下のように記述することができる。
arg1+arg2また、returnに複数の値を , で繋げて書くと配列として戻される。
return 1,2,3のようになる。
staticメソッド
def self.<メソッド名> (引数...) 処理内容 end
- 呼び出し
AClass.method(x)
初期化メソッド
newにより、インスタンスを生成する際に呼び出される。
def initialize (引数...) 処理内容 end
引数
- 省略可能
変数名=デフォルト値
- 可変引数
*変数名
可変引数はメソッドの引数の最後の引数として定義する必要がある。
- ハッシュ引数
変数名={}
呼び出し時に キー名:値,キー名:値… の形式で、任意の個数のペアを与えることができる。
methodA "abc", num: 1, str: "aaa"
- ブロック
&変数名
ブロック(do~end)として与えられ、メソッド内ではProcクラスのオブジェクトとして渡される。
callメソッドでブロックを実行することが可能。
例外
例外の発生
raise [例外クラス,] <メッセージ>例外クラスを指定しなかった場合はRuntimeErrorとなる。
例外の捕捉
begin 例外が発生する可能性のある処理 rescue [例外クラス, ...] [=> 例外変数] 例外処理 rescue [例外クラス, ...] [=> 例外変数] 例外処理 else 例外が発生しなかった場合の処理 ensure いずれの場合にも実行される処理 end
例外クラスを指定しなかった場合はStandardErrorクラスを指定したとみなされる。
例外変数を指定しなかった場合でも $! 変数により参照できる。
また、 $@ 配列変数でスタックとレースを参照できる。
特殊なリテラル
文字コード
文字の前に?をつけることで、文字コードの数値を取得できる。
?A # 0x41
数値区切り
数値の間に_をはさむことができる。
1_000_000 # 1000000
外部コマンド実行
“で挟んだ文字列は外部コマンドとして実行され、結果の文字列が返される。
`pwd`
%記法
%<フラグ><記号><文字列><記号>の形式で記述した文字列は特殊な形式に変換される。
- フラグの種類
- Q / なし
ダブルクォートで囲んだ文字列 - q
シングルクォートで囲んだ文字列 - x
外部コマンド出力(“と同じ) - r
正規表現 - w
空白で区切ったシングルクォートで囲んだ文字列
%w{aaa bbb ccc} # ['aaa', 'bbb', 'ccc']
- W
空白で区切っダブルクォートで囲んだ文字列
%w{aaa bbb ccc} # ["aaa", "bbb", "ccc"]
- s
シンボル
- Q / なし
Rangeオブジェクト
<整数>...<整数>もしくは
<整数>..<整数>
正規表現
/<正規表現>/[フラグ]
特殊な変数
- __FILE__
現在実行中のプログラムファイル名 - __LINE__
現在実行中のプログラムの行番号 - __method__
現在実行中のメソッド名 - STDIN(定数(変更不可))
標準入力 - STDOUT(定数(変更不可))
標準出力 - STDERR(定数(変更不可))
標準エラー出力 - $stdin
標準入力 - $stdout
標準出力 - $stderr
標準エラー出力 - ENV
環境変数の配列 - ARGF
引数で指定されたファイル名を読み取り、その中身を参照できる。
ファイル名を複数指定した場合は、ファイルの区切りを意識せず、連結して参照できる。 - $0
プログラムファイル名 - $$
プロセスID
コマンドライン引数
ARGV
テキストファイル操作
オープン
リード
クローズ
書き込みオープン
追記書き込みオープン
ライト
ネイティブコマンド実行
バッククォートで囲むとネイティブコマンドとして実行される。
結果は行数にかかわらず、1行に連結して返されるので、別途分割が必要。
result = `<コマンド>`.split("\n");
その他
BEGIN / END
プログラム実行開始時、終了時に行いたい処理をBEGIN / ENDブロック中に記述することができる。
BEGIN { 処理内容 }
END { 処理内容 }