心はいつもAirPucci (空元気でもいいから)

毎日がPucciを着ているような気分

パーフェクトRuby 2章Rubyの基礎 2-7-3 シンボル

   


p61
2-7-3 シンボル
シンボル好きです。Ruby始めた頃の一番最初の疑問が、シンボルは何個まで作れるか?というのですが、RailsGirls松江のときにチューターさんに質問したところ上限はないとのこと。多分200万個でも大丈夫とのこと。これで安心。よい設計かは別としてどんどんシンボル作っちゃおう!

公式のリテラルにシンボルの説明あり。
Symbolクラスのインスタンス。 ある文字列とSymbolオブジェクトは一対一に対応します。
Symbolクラスは、シンボルを表すクラス。シンボルは任意の文字列と一対一に対応するオブジェクトです。

グローバル変数とか定数定義でいいんじゃない?と最初覆ったけど、値を定義するためにシンボルを使うんじゃない。以下コピペ。

用途

実用面では、シンボルは文字の意味を明確にします。`名前’を指し示す時など、 文字列そのものが必要なわけではない時に用います。

ハッシュのキー { :key => “value” }
アクセサの引数で渡すインスタンス変数名 attr_reader :name
メソッド引数で渡すメソッド名 __send__ :to_s
C の enum 的な使用 (値そのものは無視してよい場合)

シンボルを使うメリットは

新しく文字列を生成しない分やや効率がよく、比較も高速。
文字の意味がはっきりするのでコードが読みやすくなる
immutable なので内容を書き換えられる心配がない

大抵のメソッドはシンボルの代わりに文字列を引数として渡すこともできるようになっています。

2-7-4 配列
配列は[]で囲む。%w()でもよい。%i()でシンボルの配列。

[1, 2, 3]
%w(a b c) #=> ["a", "b", "c"]
%i(a b c) #=> [:a, :b, :c]

配列に名前を付けて、要素の位置を数字で特定できる。添字も[]で囲む。

kudamono = ["ringo", "banana", "mikan"]
puts kudamono[1] #=> banana 

2-7-5 ハッシュ
連想配列のこと。{}で囲む。書き方は3種類

{ 1 => 2, 2 => 4, 3 => 6}
{ :a => "A", :b => "B", :c => "C" }
{ a:"A", b:"B", c:"C" } # 一つ上の例と同じ。キーがシンボルの場合はこのように書ける。

3番目が一番好きだ。

ハッシュにも名前をつけて、添字で要素特定。添字にはキーを使う。添字は[]で囲む。

kudamono = {ringo: "apple", mikan: "orange", nashi: "pair"}
puts kudamono[:ringo] #=> apple

2-7-6 範囲
範囲オブジェクト。(1..5)と(1…5)で意味が違うややこしい。
ピリオド2つは以上以下
ピリオド3つは以上未満。
数字だけじゃなく、日付でもいい。Rubyお約束どおり○括弧は不要。

p64
2-7-7 正規表現
パターンマッチ。5-3で記法についてはあとでやる。

2-7-8 %記法の括弧
なんかマニアックだけど%記法の()は{}とかでもいいらしい。

2-7-9 手続きオブジェクト(Proc)
これも仕様としては立ち位置中途半端感があって使いどころがよくわからない。
関数をオブジェクトとして扱う。Proc.newにブロックを渡す。仮引数は||で囲む。

def foo
  pr = Proc.new
  pr.call('Jorin') #丸括弧はなくてもよい。
end
foo {|arg| puts "Hello,#{arg}!" }
# => Hello,Jorin!

greetr = Proc.new {|name| puts "Hello,#{name}!"}
greeter.call 'Jorin'
#=> Hello,Jorin! #短く書いた

by_proc = proc {|name| puts "Hello,#{name}!"}
by_proc.call 'Jorin'
#=> Hello,Jorin! #Proc.newの代わりにprocで書いた

by_lambda = lambda {|name| puts "Hello,#{name}!"}
by_lambda.call 'Jorin'
#=> Hello,Jorin! #Proc.newの代わりにlambdaで書いた

by_literal = ->(name) {puts "Hello,#{name}!"}
by_literal.call 'Jorin'
#=> Hello,Jorin! #Proc.newの代わりに->で書いた

->(name) {puts "Hello,#{name}!"}.call 'Jorin'
#=> Hello,Jorin! #一行にまとめた

procとかlambdaはRailTutorialにも出てきて、わからなくてもいいと書いてあるのですが、使いどころがピンときません。

jojos = ["Jonathan", "Joseph", "Jotaro", "Jorin"]
 
def hello(names)
  names.each do |name|
#    puts "Hello, #{name}"
    ->(name) {puts "Hello,#{name}!"}.call "#{name}"
  end
end
 
hello(jojos)

簡単にかけるところを余計に難しくかいてあってバカみたいだ。
proc, lambda, ->は8章で別途やる。

 - テクニカル ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

no image
RailsTutorial4.0を高速で復習する。6.2.4章。

6.2.4フォーマットを検証する です。 メールアドレスは文字数制限だけじゃだめ …

no image
MacBookAirは壊れるの?

1ヶ月ぶりにWindows機を立ち上げています。HDDのカリカリ言う音が冷や汗も …

詳解 Objective-C 2.0 第3版 CHAPTER3 継承とクラス

[]多用といいメッセージキーワードといい、やっぱObjective-Cってキモチ …

no image
RailsTutorial4.0を高速で復習する。3.5章。つづき。

3.5演習の2もんめをやります。 2.お気付きの方もいると思いますが、リスト3. …

iPad使用前/使用後、雑感。

5/28にiPadがAppleStoreからクロネコヤマトで届けられました。 週 …

attr_accessorでRuby文法を噛み締める

作りたいwebアプリがあって、プログラムやろう!となって現在にいたってる訳です。 …

MacBookAirにMavericksインストールしました

先週の話になってしまいますが、MacBookAirにMavericksインストー …

no image
テンプレとヘルパーの順番

http://yourdomain/actionxを呼んだときのactionx用 …

no image
iPhoneの月請求は8円のみです。

昨年11月に、e-mobileからiPhoneにMNPしました。 ちょうど、乗り …

no image
Rails 3.2と4.0、複数バージョンをインストールする

Rubyを複数バージョン入れて切り替えて使える事を確認しました。次はRailsを …