心はいつも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

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

  関連記事

初めてのRuby2章「配列とハッシュ」

Railsだってgemの一種!ってことで、Rubyの文法からちゃんとやりたいです …

no image
Mavericksでruby2.0 rails4.0.0のGem

MacBookAirにMavericksインストールして初めてのrails ne …

Railsを立ち上げる

RubyのアップデートとRailsのインストールが無事終わったので、いよいよRa …

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

巷にRails4本がなく、Rails3本をRails4でやってみようとしたところ …

no image
あんたのrakeは新しいけど古いのが必要なんだよっ!!と怒られた

Mavericksってrubyが2.0になったんですね。 てのはおいといて、 r …

no image
ヘルパーメソッドを自作する

便利なrailsのヘルパーメソッド。自分でも作れます。 作るときは、 アプリのd …

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

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

画面キャプチャ系extension

現在メインブラウザはchromeを利用しています。画面キャプチャextensio …

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

7.2ユーザー登録フォーム、です。 ユーザー認証も登録も、モデルは作ってあるので …

no image
RailsTutorial4.0を高速で復習する。3.5章。最後の問題。

3.5演習、3もんめ、最後の問題です。 3.(上級者向け)「Heroku pag …