Ruby技術者認定試験Silver 2.1 学習用の個人的なメモ

# はじめに
こちらに記載している情報はRuby技術者認定試験Silver合格に向けた
学習用の個人的なメモとなります。

# 実行環境
## バージョン
```
% ruby -v
ruby 2.1.6p336 (2015-04-13 revision 50298) [x86_64-darwin14.0]
```

## 変数と定数
- 変数
 - 同じ変数に異なる型の値を入れる事が可能
 - 変数宣言時に型を定義する必要はない
 - 変数名は半角小文字英から始める
 - アンダーバー以外の記号は利用しない

- 定数
 - 定数名は半角大文字英から始める
 - 定数値は更新できるが警告が出力される

- 予約語

```yoyakugo.rb
nil
true
false
not
or
and
BEGIN
END
begin
end
do
then
yield
rescue
ensure
class
module
def
defined?
alias
undef
super
self
return
while
until
for
in
break
next
redo
retry
case
when
if
unless
else
elsif
__LINE__
__FILE__
__ENCODING__

```


```hensteis.rb
# 変数に文字列を入れる
hensu = "aaa"
p hensu
# 変数に数値を入れる
hensu = 1
p hensu

# 定数に文字列を入れる
TEISU = "aaa"
p TEISU
# 変数に数値を入れる
TEISU = 1
p TEISU
```

```
% ruby hensteis.rb
"aaa"
1
"aaa"
hensteis.rb:12: warning: already initialized constant TEISU
hensteis.rb:9: warning: previous definition of TEISU was here
1
```

## 関数とクラスの定義
```kanskuras.rb
# 関数を定義
def kansu (a, b)
	a + b
end

# classを定義
class Kuras
	def mesodo1 (a, b)
		a + b
	end
end

p kansu 100, 200
p "kansu -> " + kansu(100, 200).to_s
workClass = Kuras.new
p workClass.mesodo1 100, 200
p "Kuras.mesod1 ->" + workClass.mesodo1(101, 201).to_s

```

結果

```
% ruby kanskuras.rb
300
"kansu -> 300"
300
"Kuras.mesod1 ->302"
```

## 組み込み定数
```kumikomites.rb
# 組み込み定数 STDIN
print "入力してください: "
ins = STDIN.gets
p ins

# 組み込み定数 STDOUT, STDERR
STDOUT.puts "STDOUT!"
STDERR.puts "STDERR!"

# 組み込み定数 ENV
p ENV['LANG']

# 組み込み定数 ARGF
# `filename': No such file or directory になってしまう
#if ARGF.filename then
#	p "ARGF ->" + ARGF.filename
#end

# 組み込み定数 ARGV + ARGF
if ARGV[0] then
    p "ARGV[0] ->" + ARGV[0]
    if File.exists?(ARGV[0]) then
        p "ARGF ->" + ARGF.filename
	end
end
if ARGV[1] then
    p "ARGV[1] ->" + ARGV[1]
end

# 組み込み定数 DATA + __END__
p "DATA sono 1 -> " + DATA.gets
p "DATA sono 2 -> " + DATA.gets
p "DATA sono 3 -> " + DATA.gets
p "DATA sono 4 -> " + DATA.gets

__END__

2

4
5

```

結果

```
% ruby kumikomiteis.rb 1 2
入力してください: あああ
"あああ\n"
STDOUT!
STDERR!
"ja_JP.UTF-8"
"ARGV[0] ->1"
"ARGV[1] ->2"
% ruby kumikomiteis.rb test.rb
入力してください: aaa
"aaa\n"
STDOUT!
STDERR!
"ja_JP.UTF-8"
"ARGV[0] ->test.rb"
"ARGF ->test.rb"

% ruby kumikomiteis.rb
入力してください: aaa
"aaa\n"
STDOUT!
STDERR!
"ja_JP.UTF-8"
"DATA sono 1 -> \n"
"DATA sono 2 -> 2\n"
"DATA sono 3 -> \n"
"DATA sono 4 -> 4\n"
```

## コマンドラインオプション
- require
 - 何回実行しても一回しかロードされない
 - .rb 省略可能
- load
 - 実行した回数ロードされる
 - .rb 省略するとエラーになる

```
% ruby -d -I~/Projects/ruby_work/common -rcommon.rb call_common.rb
Exception `LoadError' at /.rvm/rubies/ruby-2.1.6/lib/ruby/site_ruby/2.1.0/rubygems.rb:1222 - cannot load such file -- rubygems/defaults/operating_system
Exception `LoadError' at /.rvm/rubies/ruby-2.1.6/lib/ruby/site_ruby/2.1.0/rubygems.rb:1231 - cannot load such file -- rubygems/defaults/ruby
"common_func01 -> param1 :p1 param2 :p2"
"DEBUG now"

% ruby -I~/Projects/ruby_work/common -rcommon.rb call_common.rb
"common_func01 -> param1 :p1 param2 :p2"

% ruby -c call_common.rb
Syntax OK

% ruby -W0 hensteis.rb
"aaa"
1
"aaa"
1
2

% ruby -W1 hensteis.rb
"aaa"
1
"aaa"
hensteis.rb:13: warning: already initialized constant TEISU
hensteis.rb:10: warning: previous definition of TEISU was here
1
hensteis.rb:16: warning: already initialized constant TEISU
hensteis.rb:13: warning: previous definition of TEISU was here
2

% ruby -e "puts('Hello, World')"
Hello, World
```

##Rubyで利用されている環境変数
- RUBYOPT
 - デフォルトコマンドオプションが指定可能
- RUBYLIB
 - LOAD_PATHの次に追加可能なパス（-Iオプションと同義）

##特殊変数

```tokusyu.rb

# 最後に取得したgets か readline
s = STDIN.gets
p "$_ --> " + $_
p "s --> " + s

s = "0abcdefg1abcdefg"
m = s.match(/abc/)

p " m --> #{m}"
# マッチした文字列
p " $& --> #{$&}"
# マッチ文字より前
p " $` --> #{$`}"
# マッチ文字より後
p " $' --> #{$'}"


# matchオブジェクト
p " $~.class --> #{$~.class}"


s = "0abcdefg1abcdefg"
m = s.match(/abc(d)(efg)/)
# 最後にHitした括弧
p " $+ --> #{$+}"
# １番目にHitした括弧
p " $1 --> #{$1}"
# ２番目にHitした括弧
p " $2 --> #{$2}"

begin
	1 + "a"
rescue
	#バックトレース
	p "$@ --> #{$@}"
	#例外オブジェクト
	p "$! --> #{$!}"
	#実行ファイル名
	p "$0 --> #{$0}"
	#実行パラメータ
	p "$* --> #{$*}"
end
#　LOAD_PATH
p "$: --> #{$:}"

```

結果

```
% ruby tokusyu.rb test test2
abc
"$_ --> abc\n"
"s --> abc\n"
" m --> abc"
" $& --> abc"
" $` --> 0"
" $' --> defg1abcdefg"
" $~.class --> MatchData"
" $+ --> efg"
" $1 --> d"
" $2 --> efg"
"$@ --> [\"tokusyu.rb:33:in `+'\", \"tokusyu.rb:33:in `<main>'\"]"
"$! --> String can't be coerced into Fixnum"
"$0 --> tokusyu.rb"
"$* --> [\"test\", \"test2\"]"
"$: --> [\"/.rvm/rubies/ruby-2.1.6/lib/ruby/site_ruby/2.1.0\", \"/.rvm/rubies/ruby-2.1.6/lib/ruby/site_ruby/2.1.0/x86_64-darwin14.0\", \"/.rvm/rubies/ruby-2.1.6/lib/ruby/site_ruby\", \"/.rvm/rubies/ruby-2.1.6/lib/ruby/vendor_ruby/2.1.0\", \"/.rvm/rubies/ruby-2.1.6/lib/ruby/vendor_ruby/2.1.0/x86_64-darwin14.0\", \"/.rvm/rubies/ruby-2.1.6/lib/ruby/vendor_ruby\", \"/.rvm/rubies/ruby-2.1.6/lib/ruby/2.1.0\", \"/.rvm/rubies/ruby-2.1.6/lib/ruby/2.1.0/x86_64-darwin14.0\"]"

```