第6章 変数と式
変数とはオブジェクトへの参照を保持しているもの
メソッドで、引数オブジェクトを変更すると、変更されてしまう。
→まず、複製して変更すると、元のオブジェクトに影響を与えない。
def describe(name)
name = name.dup
puts "This is a #{name}."
name[2]=?P
puts "This is a #{name}."
end
変数の種類
定数 大文字表記 CONSTANT
グローバル変数 $variable
クラス変数 @@class_variable
インスタンス変数 @instance_variable
ローカル変数 variable, _variable
グローバル変数 $stdout $: ライブラリ組み込み時の探索パス $1 最後の正規表現マッチ
定数 警告でるが、mutable
ライブラリの定数 File::RDWR File::CREAT
擬似変数 nil true false self
__FILE__ ソースファイル名 __LINE__ 行番号
慣習的制約 × PascalStyle 大文字小文字で区切る。クラス名は例外で、この方式。
incremetnt decrementはない。
多重代入 a, b, c = 1, 2, 3
a, b = b, a は可能。
a, *b = 1, 2, 3, 4, 5
p b #=> [2, 3, 4, 5]
array = [1, 2, 3]
a, b, c = *array
p a; p b; p c #=> 1 2 3
Rubyにおいて、偽とは、nil 及び falseのこと。それ以外は真。0も真。この点は、C Perl PHPと異なる。
論理積&&や論理和||はtrueやfalseではなく、オペランドのいずれかを返す。C語族とは異なる。
例 nil || 50 #=> 50
@a ||= generate_default_value @aが真なら何もせず、偽なら、generate_default_valueメソッドを呼んでそのreturn value でaを初期化する。
1..10 including 10
1...10 exlcuding 10
条件演算子
var = a ? b: c
var = if a then b else c end に同じ
制御式 値を返す。
thought = if sample.color == "green" then
"danger"
else
"undefined"
end
if式の真偽に応じてthoughtに異なる値を代入。
if ...
...
elsif ...
...
else
....
end
if修飾子 do_something if condition # endが不要
unless
(例外状況の対処)unless (通常は成立する条件)
case value
when 1 then
...
when 2,3 then
...
else
...
end
範囲分岐 正規表現による分岐もある。
===は==より緩く一致性は判定
if 0 === value then
'0'
elsif (1..9) === value then
'one keta'
else
'else'
end
case
when number.prime? then process_prime(number)
when number.fermat? then process_crmichel(number)
when number.odd? then process_odd_composite(number)
else process_even_composite(number)
endd
while condition [do]
do_something
end
do_something while condtion
後置while 最初に1回は無条件に実行
def more?
gets.chomp != 'ok'
end
begin
$stdout.print " enter 'ok' if .."
end while more?
untilもある。
for式は内部でイテレータを呼んでいる。
for nme, num in [['Jan', 1], ['Feb', 2]]
puts "#{name} は #{num}月"
end
イテレータ
loop do
puts "hello"
end
3.times {puts "Hello"} 3.times{|i| puts i}
1.upto(3) do |i| puts i end downto
脱出
loop do
puts "owari"
break if /^owari/ =~ gets
end
a = loop { break 1 }
p a #=> 1
1.upto(3) do |i|
next if i == 2 # 2ならスキップして、次の繰り返しへ
puts i
# => 1 3
例外処理
begin
do_something
rescue TypeError
..
rescue => another_error
..
else
..
ensure
.. # 例外が発生してもしなくても必ず実行
end
raise ArgumentError, 'message' ユーザーが明示的に例外を発生させるにはraise関数を使う。
大域脱出 catch throw
catch(:exit) {
loop do
loop do
throw :exit
end
end
}
#ここに脱出。
0 件のコメント:
コメントを投稿