2008年9月28日日曜日

初めてのRuby (6)

第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 件のコメント: