個人的なメモも兼ねて。随時追記する。
リテラル
ソースコードに記述し、それを何らかの形で適切に表現すことのできる「値」といったところでしょうかね、意味は。
リテラルとは、値そのものがプログラム中に直接表現されたものとのこと。
数値リテラルだと
567
とか。(ふっつーに数字やん)
文字列リテラルだと、両端の上に1つか2つ”ごま塩”つけて
'おはよう'
"おはよう"
だね。
ところで、変数というのは何か代入していないとダメみたいで、その何かというのは値や式である。で、リテラルはとどのつまり「値」であるから、変数をxとかyとかにして(なんでもいい)、
x = 567
y = "おはよう"
と代入できる。
ちなみに、変数だけ宣言すると、
NameError (undefined local variable or method `x' for main:Object)
と、やはりエラーが出てきてしまった。
さて、
配列
[6, 9, 5]
も、リテラルだし、
ハッシュ
{"name" => "Taro", "age" => "35", "height" => "179"}
も、リテラル。
だから、これらも変数に代入できちゃう。
あ、配列とかハッシュはまた後で説明するね。
そうそう、左端に、おりこうに縦に二人そろって並んでいるシンボル
:おはよう
も値。
ここで、「シンボルと文字列はなにが違うのか?」という疑問がぼくにはあるんだけど・・・。(どなたか、おしえて下さーい!!)
なお、いまのところのぼくの理解だと「文字列は具体的、シンボルは抽象的」というざっくりした理解。
(追記)
コメント欄で優秀な方々の回答がありましたので、ありがたく引用させていただくと、
文字列とシンボルの関係ですが,これは内部実装の違いと考えるのがよいかな,と思います。
文字列とシンボルは一対一に対応していて,"abc" という文字列と :abc というシンボルは対応しています。
しかし,シンボルのほうは,処理系の内部では一つの数値で表されています。
それの何がよいかというと,例えば,二つの文字列が一致している(内容が同じ;オブジェクトとしての同一性は問わない)かどうかを判定するには,処理系は文字列の先頭から 1 文字ずつ比較しないといけませんが,シンボルであれば内部では単一の数値で表されているので,一瞬で比較できます。
シンボルについて、ふとペットボトル飲料を飲んでたところ、いい感じのメタファーを思いつきましたので
「午後の紅茶 無糖」という商品名を文字列とすると、4909411077457というバーコード(JAN)がシンボルです。
帳簿などをつける際、いちいち商品名を書くのは面倒ですしJANですませます。
「午後の紅茶 ストレートティー」と比較する場合も商品名を比較するより、JANを比較した方が
同一かどうかがすばやく正確にわかります。
サーバー(ruby本体)に問い合わせれば商品名↔JANの対照ができます。
とのことだそうです。
(/追記)
配列
情報を並べて入れることができる「箱」のようなもの。
たとえば、よく実家から箱に入って「スルメイカ(squid)」とか「ミカン(orange)」とか「ビール(beer)」とか詰め合わせで送られてくるじゃないですか(?)
それを配列で表してみると
goods = ['squid', 'orange', 'beer']
となる。
ここで、eachメソッドというものを紹介しておく。eachメソッドとは、配列の要素を順番に取り出していくメソッドのことである。要素とは、配列内部の個々の情報のことであり、ここで言うと「squid」や「orange」、「beer」が要素ということである。
で、eachメソッドはどう使うかというと、
goods.each do |g|
puts g
end
とすると、(ちなみに、このg
のことをブロック引数と言う。)結果は
squid
orange
beer
となる。
なお、
['squid', 'orange', 'beer'].each do |g|
puts g
end
としても同じ結果となる。
ちなみに、以下のように、「<<」を用いて配列に要素をあとから追加することもできる。
じっさいにやってみると、
2.5.1 :001 > a = []
=> []
2.5.1 :002 > a << "apple"
=> ["apple"]
2.5.1 :003 > a << "orange"
=> ["apple", "orange"]
2.5.1 :004 > a << "banana"
=> ["apple", "orange", "banana"]
となった。
あ、2.5.1 :001 >
みたいなのはターミナル(コマンドプロンプト)でやったときについてくるオマケみたいなものね。(もう今後は書かない)
どういうふうにするかは、こちらからどぞ。(公式ページ)
また、要素を以下のように番号で指定すれば、要素をとりだすことも出来る。
a = ["apple", "orange", "banana"]
a[0]
=> "apple"
a[2]
=> "banana"
配列[番号]
でとりだせるね。
気づいたと思うけど、要素は左から順に番号0,1,2,…と割り当てられている。これは、お約束ごと。
ハッシュ
構造は{キー => 値, キー => 値,...}
だ。
Pythonでいうところの「辞書」と考えていいんかな。まあいいや。
先ほどの例でいくぞ。そう、実家から送られてくるようなものシリーズだ。
以下はどれも同等!
機械の処理において、文字列とシンボルは異なる挙動なため、2番目と4番目、3番目と5番目のハッシュは同じであるが、それ以外の組み合わせは異なるもの。
goods = {'snack' => 'squid', 'fruit' => 'orange', 'drink' => 'beer'}
goods = {:snack => 'squid', :fruit => 'orange', :drink => 'beer'}
goods = {:snack => :squid, :fruit => :orange, :drink => :beer}
goods = {snack: 'squid', fruit: 'orange', drink: 'beer'}
goods = {snack: :squid, fruit: :orange, drink: :beer}
で、「どうやって値を取り出すのだ?」という感じなのだけど、配列のときは要素に割りふられた番号を指定してとり出していたのに対して、ハッシュのときはキーを指定してとり出すのだ。
ハッシュ[キー]
で取りだしていくよ。
goods['fruit']
=> "orange"
goods[:fruit]
=> "orange"
goods[:fruit]
=> :orange
goods[]
で、最後のハッシュなんだけど、
goods = {snack: :squid, fruit: :orange, drink: :beer}
=> {:snack=>:squid, :fruit=>:orange, :drink=>:beer}
と返ってきたから、値を取りだすときもこの戻り値にしたがわないといけないっぽい。
goods[fruit:]
=> SyntaxError ((irb):12: syntax error, unexpected ']')
goods[fruit:]
^
goods[:fruit]
=> :orange
そういえば、配列でeachメソッドやったんだ、ハッシュでもやっておこう。
goods = {:snack => 'squid', :fruit => 'orange', :drink => 'beer'}
goods.each do |key, value|
p key
p value
p "#{key}:#{value}"
end
:snack
"squid"
"snack:squid"
:fruit
"orange"
"fruit:orange"
:drink
"beer"
"drink:beer"
やったことをいっぺんに押し込んだら見にくくなってしまった(笑)ご勘弁を。
あ、p
というのはputs
と同じ効果ね。
演算子
a = 1
b = 2
puts a == b #aとbが一致していればtrue,間違っていればfalseを返す
puts a == a
puts a != b #aとbが一致していればfalse,間違っていればtrueを返す
puts !true #!とは、否定の役割をはたす。
#=>
#false
#true
#true
#false
続きは気がむいたら。
ぼくが知りたかったことはまとめたので、とりあえず満足(笑)
また気がむいたら続きかこっと。
(ということで、以下、工事中m(_ _)m)
【謝辞】
間違いを指摘してくださった@scivolaさん、ありがとうございました!
とても分かりやすい例を出してくださった@asmさん、ありがとうございました!