せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】パーフェクトRuby 学習感想文 ~第2章

それでは2章を読んでいきます。

(参考・経緯など)
パーフェクトRuby 学習感想文 ~はじめに


P42 Hello Ruby のレベルから違う

お約束のHelloプログラミング。
と思いましたら違いました。
ただ文字列を出力する程度ではなく、
ブロック変数・配列・文字列メソッド(upcase)、コード埋め込み(#{})など、
要素盛りだくさん
どうやらこの本は、ド初心者を想定していないようですね。

でもそんなことで負けてはいけません。


P50 きたよ!nilの説明!

P50にしてようやくnilの説明が。ちょっとほっとしました。でも遅いです。


P54 変数の頭に@?

インスタンス変数は頭に@をつける。それはいいんだけど、
宣言時にattr_accessor を使うと@はいらないらしい。
「attr_accessor :インスタンス変数名」だそうで。
@hoge ←インスタンス変数
hoge ←インスタンス変数名  ってことかな。

こういうの混乱するんだよなあ。。。


P61 ミスプリでは?⇒違った

# 式展開とバックスラッシュ記法は無効
%q(It's #{weather}) ⇒"It's \#{weather}"となります

とあるけど、これおかしくないかと思った。
だって「\」って。元の式にないよ?
「バックスラッシュ記法は無効」ってどういうこと?
もとの式に「バックスラッシュ」はないよ?

確認したら確かに「バックスラッシュ」がついて出力される。
どういうこと?
公式マニュアルみても
出力した結果に「バックスラッシュ」が追加される例はない。
分からない。
何が言いたい例なんだろう。


あと、ここでは少し%記法の説明をしているけど、
これだけじゃあ例として出てきている[%]と[%Q]の違いが分からないよ。
だって結果が同じなんだもん。。
公式マニュアルみたら
「[%]と[%Q]は同一です」って書いてあった。
だったらその一文を書いておいて欲しいです。。


P67 b ||=2 って?

b ||=2 # b = b ||2 と同じ

「と同じ」って!その意味が分からないよ。
& と&& の違いなら分かるけど、代入式でこの「|」見るのは初めてだよ。。

公式いわく、

a ||= 1 # a が偽か未定義ならば1を代入。初期化時のイディオムの一種。

なるほどね。って初見で分からんわ!


p70 組み込み、って何?

グローバル変数にはいくつか組み込みで用意されているものがあります。

組み込みって何ー?組み込みって何ーーー

 

$studout   [概要]標準出力。 初期値はSTDOUT

って、、意味分からん。。
「標準出力」です。ってどういう意味?

どうもコンソールに何か出したいときに利用するみたい。

標準出力はコンソールへの出力になります。標準出力は組み込み定数のSTDOUTとグローバル変数の$stdoutを用いて行います。これらのオブジェクトのputsやprintといったメソッドを使って、出力を行います。

http://nb-tech.doorblog.jp/archives/51474772.html

コンソール以外に出力先を変えるのは、この$stdout変数に代入すれば良いみたい。

# 標準出力の出力先を /tmp/foo に変更
$stdout = File.open("/tmp/foo", "w")
puts "foo" # 出力する
$stdout = STDOUT # 元に戻す

http://doc.ruby-lang.org/ja/2.0.0/method/Kernel/v/stdout.html

うーん。。ちょっと分かった。。


P072 AGRF???

ARGFにはスクリプトに指定されたそれぞれの引数をファイル名とみなして、それらのファイルを連結して1つのファイルのように表現したものが入っています。

はい。。すみません

泣いてても仕方ないので、手を動かしてみる

■テスト用ファイル

aaa.txt
a1
a2
a3

bbb.txt
b1
b2
b3

ccc.txt
c1
c2
c3

■argf_study.rb

ARGV.replace %w(hoge/aaa.txt hoge/bbb.txt hoge/ccc.txt)
print ARGF.read

■結果

a1
a2
a3
b1
b2
b3
c1
c2
c3

はあ。なるほど。ARGFは確かに「一つのファイルのようにまとめたもの」だね。
次はブロック変数でまわしてみる(公式リファレンスのコードを拝借)。

■argf_study.rb

ARGV.replace %w(hoge/aaa.txt hoge/bbb.txt hoge/ccc.txt)
ARGF.each {|line|
# 処理中の ARGV の内容を表示
p [ARGF.filename, ARGV];
}
# 最後まで読んだ後(ARGVが空)の動作
p ARGF.gets
p ARGF.filename

■結果

["hoge/aaa.txt", ["hoge/bbb.txt", "hoge/ccc.txt"]]
["hoge/aaa.txt", ["hoge/bbb.txt", "hoge/ccc.txt"]]
["hoge/aaa.txt", ["hoge/bbb.txt", "hoge/ccc.txt"]]
["hoge/bbb.txt", ["hoge/ccc.txt"]]
["hoge/bbb.txt", ["hoge/ccc.txt"]]
["hoge/bbb.txt", ["hoge/ccc.txt"]]
["hoge/ccc.txt", ]
["hoge/ccc.txt",
]
["hoge/ccc.txt", []]
nil
"hoge/ccc.txt"

はあ。なるほど。

ってこれ初心者にはちょっとハードル高いと思うんですが。。普通?
どんどん不安になる中、2章終了。


余談だけど、公式リファレンスが古いみたい?

1.9以降 ARGF.skip すると次の読み込みで IOErrorになるみたいで、
公式に載っているプログラムを実行するとエラーになった。
argf_study.rbは、skip を抜いたもの。

(参考)
http://comments.gmane.org/gmane.comp.lang.ruby.japanese/8298