文字列〜シンボル〜配列〜ハッシュ

おもむろにRubyなど。Rails for PHP Developers という良い本をいただいたので、Rubyで遊んでいる次第です。環境はCentOS5.2の1.8.5。もうちょい遊んだらバージョン上げよかな〜?

変数・文字列・シンボル

intはアンダースコア入れてもいいんだって。

# large int
large = 123_456_789
p large
123456789


文字列中の変数展開は #{}

# strings into lines
my_string = <<EOT
ignore #{large}
hoge
hogehoge
EOT

p my_string
"ignore 123456789\nhoge\nhogehoge\n"


文字列のクオート。

q = %q{foo bar baz}
p q
"foo bar baz"


文字列は厳密に言うと違うオブジェクトらしい。唯一性を保証するのはシンボル。

# symbols
hoge = "magazine"
fuga = "magazine"
p hoge == fuga  # これはtrueになる
p hoge.equal? fuga # これはfalse

hoge = :magazine
fuga = :magazine
p hoge == fuga  # これはtrueになる
p hoge.equal? fuga # これもtrue
true
false
true
true


シンボルは唯一性が保証されてるからハッシュのキーに良く使われる。

list_hoge = {:name => "sotarok", :age => 23}
p list_hoge
{:name=>"sotarok", :age=>23}

シンボル


唯一性だと?
.intern と .to_sym はどっちが一般的なんだ?yuguiさんは「はじめてのRubyで」インターンされた文字列っていってた。つかRubyのドキュメント見てもそう書いてあったけど。インターンってなんぞか。

hoge = 'fuga'
hoge_symbol_intern =  hoge.intern
hoge_symbol_sym    = hoge.to_sym
p hoge, hoge_symbol_intern, hoge_symbol_sym
"fuga"
:fuga
:fuga


.intern .to_sym は等価っぽい。

p hoge == hoge_symbol_intern
p hoge == hoge_symbol_sym
p hoge_symbol_intern == hoge_symbol_sym
false
false
true


ほうほう。

array_test = {'fuga' => 1, :fuga => 2}
p array_test['fuga']
p array_test[:fuga]
p array_test[hoge]
p array_test[hoge_symbol_intern]
1
2
1
2

配列

fruit = ['banana', 'apple', 'orange']
p fruit
p fruit[0]
p fruit[1]
p fruit[2]
["banana", "apple", "orange"]
"banana"
"apple"
"orange"
colors = %w{blue red yellow}  # 空白区切りで配列に
p colors
["blue", "red", "yellow"]
colors = %w/blue red yellow/  # デリミタはなんでもいい
p colors
["blue", "red", "yellow"]

PHPでこれをやろうとするとこんなかんじか。

<?php
$colors = explode(" ", "blue red yellow");

だっせえ。

fruit = ['apple']
fruit << 'banana'
fruit[5] = 'orange'  # あいだには nil がはいる
p fruit

p colors[5] # 存在しなければnilがかえる
["apple", "banana", nil, nil, nil, "orange"]
nil
# delete element
colors.delete_at(1) # インデックスで削除 => 間はつめられる
p colors
["blue", "yellow"]
# foreach みたいな
colors.each {|color|
    p color
}
"blue"
"yellow"
# 配列の配列とか
people = [['Joe', 'W', 'Smith'], ['Jane', 'M', 'Doe']]
people.each do |first, middle, last|
    p "#{first} #{middle}. #{last}"
end
"Joe W. Smith"
"Jane M. Doe"
# array の分解
p *people
hoge, fuga = *people  # こんなかんじでうごく?
p hoge, fuga
["Joe", "W", "Smith"]
["Jane", "M", "Doe"]
["Joe", "W", "Smith"]
["Jane", "M", "Doe"]

うごいた。

ハッシュ

# hash 初期化
person = {:name => "Joe", :age => 23,}
p person
p person[:name]
{:name=>"Joe", :age=>23}
"Joe"
# 要素+
person[:country] = 'Japan'
p person
{:name=>"Joe", :age=>23, :country=>"Japan"}
# 要素の更新 or 追加
person.update(:name => "Joe", :eyes => 'black')
p person
{:name=>"Joe", :age=>23, :country=>"Japan", :eyes=>"black"}
# 要素の変更
person[:eyes] = 'blue'
p person
{:name=>"Joe", :age=>23, :country=>"Japan", :eyes=>"blue"}
# 要素の削除
person.delete(:eyes)
p person
{:name=>"Joe", :age=>23, :country=>"Japan"}
# もしほげほげだったら・・・
person.delete_if{|key, value| value == 'Joe'}
p person
{:age=>23, :country=>"Japan"}
person[:name] = 'Joe'  #とりあえず復活させる
p person
person.delete_if{|key, value| key == :name and value == 'Joe'} # 複数条件も
p person
{:name=>"Joe", :age=>23, :country=>"Japan"}
{:age=>23, :country=>"Japan"}
# なんでもハッシュのキーになりうる
class Use
end
fruit = ['apple', 'orange']

hash = {User.new => 'Joe', fruit => 'yummy'}
p hash
p hash[fruit]
# おいUserのほうどうやってアクセスすんだw
{["apple", "orange"]=>"yummy", #<User:0xb7ef065c>=>"Joe"}
"yummy"

型自動変換


まーPHPのようにはいかんよね。これが普通。

# type juggling
#p 1 + "2"  # これはrubyではダメ
p 1 + "2".to_i

p 1.1 + 2
3
3.1


今日はこのへんで。
また暇があったら遊ぶ。

Rails for PHP Developers

で、読んでるこの本ですが、非常に良い本です。PHPとの違いを具体的にコードで書いてあったりして、Railsにはもともとあまり興味はなかったのですが、Rubyには興味があったので、特に3章の「PHP to Ruby at a Glance」という章は非常に参考になります。
素敵な本です。

Rails for PHP Developers (The Facets of Ruby)

Rails for PHP Developers (The Facets of Ruby)

はじめてのRuby

あとちょくちょくこっちの本も参照中。こちらも良い本ですね。

初めてのRuby

初めてのRuby