Rubyの勉強を初めてから、ただいまパーフェクトRubyとプログラミング言語Rubyという書籍を並行して進めるカニバサミ勉強中。この2冊を同時に進めてみて気になったとこやらをあれこれツラツラと書いてみるパート4
ではでは。
・変数の入れ替えがこんな簡単にできる
熟練度は低いですが基本的にはCの頭で出来ているので、これには少し驚き桃の木。
irb(main):001:0> x = 1 => 1 irb(main):002:0> y = 5 => 5 irb(main):003:0> x, y = y, x => [5, 1] irb(main):004:0> x => 5 irb(main):005:0> y => 1
・*をつかえば配列の要素という事にできる
いつ使うのかイメージが湧きませんが、頭に入れておいて損はないという予感がビビビときたので載せておきます。
irb(main):001:0> x, *y = 1, 2, 3 => [1, 2, 3] irb(main):002:0> x => 1 irb(main):003:0> y => [2, 3] irb(main):004:0> x, y, *z = 1, *[2, 3, 4] => [1, 2, 3, 4] irb(main):005:0> x => 1 irb(main):006:0> y => 2 irb(main):007:0> z => [3, 4]
・ド・モルガンってこんなのだっけ…
公式なんて正直覚えてないですが内容は当たってますって言い方をするのはおかしいけれどw
当たってます。
irb(main):068:0> if !(a > 1 && a > 4) then p 'hoge' end "hoge" => "hoge" irb(main):069:0> if !(a > 1) || !(a > 4) then p 'hoge' end "hoge" => "hoge" irb(main):072:0> if !(a > 1 || a > 4) then p 'hoge' end => nil irb(main):073:0> if !(a > 1) && !(a > 4) then p 'hoge' end => nil
・モジュールの特徴
●インスタンスを生成できない
忘備録的な意味で書いておこう。いつ使うのかわからんけど。
●継承することができない。
クラスと違ってモジュールは継承できないという事だね。
・モジュール関数の呼び方
●モジュールをレシーバにして呼び出す。ここではMathを呼んでます。
irb(main):005:0> Math.sqrt(2) => 1.4142135623730951
●Includeする。ここではMathを呼んでます。
irb(main):008:0> include Math => Object irb(main):009:0> sqrt(2) => 1.4142135623730951
・autoloadは指定したモジュール、クラスが最初に参照された時に自動的にrequireされる。
名前からするとプログラム実行時にloadされそうな、名前の印象からして効果を間違えそうなのだけれど、実行時にloadするのってrequireやん?と冷静に考えればどうということはない。ってか。
・クラスは
クラスはだいたいObjectクラスから派生したサブクラス。定義したクラスもスーパークラスを定義しなかった場合は、自動的にObjectクラスを継承する。
irb(main):025:0* hoge = 'a' => "a" irb(main):026:0> hoge.class => String irb(main):027:0> hoge.class.superclass => Object irb(main):028:0> hoge = 1 => 1 irb(main):029:0> hoge.class => Fixnum irb(main):030:0> hoge.class.superclass => Integer irb(main):031:0> hoge.class.superclass.superclass => Numeric irb(main):032:0> hoge.class.superclass.superclass.superclass => Object irb(main):002:0> Array.class.superclass => Module irb(main):003:0> Array.class.superclass.superclass => Object irb(main):010:0> Range.class.superclass.superclass => Object irb(main):012:0* SyntaxError.superclass.superclass => Exception irb(main):013:0> SyntaxError.superclass.superclass.superclass => Object irb(main):001:0> class Hoge irb(main):002:1> end => nil irb(main):003:0> Hoge.superclass => Object
・キーワードリテラル
irb(main):001:0> nil => nil irb(main):002:0> true => true irb(main):003:0> false => false irb(main):004:0> self => main irb(main):006:0> __FILE__ => "(irb)" irb(main):007:0> __LINE__ => 7 irb(main):008:0> __ENCODING__ => #<Encoding:UTF-8>
・オブジェクトは”ポインタのようなもの”らしいけれど
オブジェクトについて理解できていない状態だと説明文を読んだらそのまんま、”ポインタのようなもの”としか解釈ができにゃいなあ。
「オブジェクト参照」という単元の説明もあったけれど、この結果を見た方が分かりやすい気がします。ただ、これを見ると”ポインタのようなもの”というか、”これはポインタだ”と思っちまうのだよね。ポインタのことをどれだけ理解しているのかは置いといてだ。
irb(main):001:0> a = "Ruby" => "Ruby" irb(main):002:0> b = c = "Ruby" => "Ruby" irb(main):003:0> a.equal?(b) => false irb(main):004:0> b.equal?(c) => true irb(main):008:0> a == b => true
・0.0/0.0 は数字ではないけれど
数字とみなすと 0 だのな。
irb(main):003:0> num = 0.0/0.0 => NaN irb(main):004:0> num => NaN irb(main):006:0> a.to_i => 0 irb(main):010:0> a.to_f => 0.0
・例外処理が初見では分かりにくいぜ
そのまんま。使ってみないと分かりにくい。
#!/home/takeken/.rbenv/shims/ruby begin file = File.open('hoge.txt') rescue puts 'Fileがみつかりませぬ' ensure file.close if file end
・例外オブジェクトあれこれ
お手軽だ。今のところ例外を活かしたものが書けていないので使わないとだ。
e.class [takeken@localhost]$ ./hoge.rb Error occurred (Errno::ENOENT) e.message [takeken@localhost]$ ./hoge.rb Error occurred (No such file or directory @ rb_sysopen - hoge.txt) e.backtrace [takeken@localhost]$ ./hoge.rb Error occurred (["./hoge.rb:4:in `initialize'", "./hoge.rb:4:in `open'", "./hoge.rb:4:in `<main>'"])
・レシーバ・引数なしでメソッドを呼び出すときはカッコを省略できない
そのままの意味です。
・ブロックとして渡す
こういう書き方もできるみたいで、この辺はあんまり根詰めてやっちゃうとおいらの頭だとパニックしそうだから、だいたいで流しておこうと思う。
#!/home/takeken/.rbenv/shims/ruby people = %w(Alice Bob Charlie) block = Proc.new do |name| puts name end people.each &block [takeken@localhost]$ ./hoge.rb Alice Bob Charlie
・RequireしたファイルのパスはLOADED_FEATURESという変数に追加される
調べてみた。なるほど。
irb(main):001:0> x = p $LOADED_FEATURES irb(main):002:0> p x.last(1) ["/home/takeken/.rbenv/versions/2.1.5/lib/ruby/2.1.0/rubygems/dependency.rb"] => ["/home/takeken/.rbenv/versions/2.1.5/lib/ruby/2.1.0/rubygems/dependency.rb"] irb(main):003:0> require 'json' => true irb(main):004:0> p x.last(1) ["/home/takeken/.rbenv/versions/2.1.5/lib/ruby/2.1.0/json.rb"] => ["/home/takeken/.rbenv/versions/2.1.5/lib/ruby/2.1.0/json.rb"]
・数値じゃない?
to_i で数値化しないと、数値を入れようが、zero? そんなメソッド知らんと言われる。他にもto_i などなど色々とある。
#!/home/takeken/.rbenv/shims/ruby # coding: utf-8 n = ARGV[0].to_i if n.zero? puts '0でした' elsif n.even? puts '偶数です' elsif n.odd? puts '奇数です' end
理由はこれ(と思う)
irb(main):001:0> ARGV[0].class => NilClass irb(main):002:0> 1.class => Fixnum irb(main):003:0> ARGV[0].to_i.class => Fixnum
・こんな感じでもウゴク
何となく、これで動くんだって思ったので登録。
まだまだ慣れてない感じがありあり。
久しぶりにPythonを見て、閉じないんだ!って思うくらい馴染んでない。
#!/home/takeken/.rbenv/shims/ruby # coding: utf-8 class Hoge def moge yoge = 'roge' case yoge when 'roge' then 'Yes!' when 'woge' then 'no' end end end you = Hoge.new p you.moge [takeken@localhost ~]$ ruby test.rb "Yes!"
・ローカル変数の扱いはC言語の時と同じ感じだけれど
プロトタイプ宣言とかなくてクラスはライブラリでまとめてrequireするのがRuby… と思う。
でもRubyをやりだしてJqueryがまだ見れるようになった。
[takeken@localhost ~]$ ruby test.rb a Alice Bob Carol "Carol" "" [takeken@localhost ~]$ cat test.rb #!/home/takeken/.rbenv/shims/ruby # coding: utf-8 name = '' class Hoge def tage for name in %w(a Alice Bob Carol) puts name end p name end end hoge = Hoge.new() hoge.tage p name
上と下は同じです。
分けて書いてみると変数がどうなっているか分かりやすいのかな。
[takeken@localhost ~]$ ruby test.rb a Alice Bob Carol "Carol" "" [takeken@localhost ~]$ cat test.rb #!/home/takeken/.rbenv/shims/ruby # coding: utf-8 require './hoge.rb' name = '' hoge = Hoge.new() hoge.tage p name [takeken@localhost ~]$ cat hoge.rb #!/home/takeken/.rbenv/shims/ruby # coding: utf-8 class Hoge def moge languages = %w(Perl Python Ruby) i=0 while i < languages.length puts "Hello, #{languages[i]}." i += 1 end end def tage for name in %w(a Alice Bob Carol) puts name end p name end end
・BEGINの扱い。
最初に読み込むBEGIN。実行結果を見てみると!!が出ていないのがわかる。
BEGINにいった後はまた上からだってのが分かりやすいと思ったスクリプト。
#!/home/takeken/.rbenv/shims/ruby # coding: utf-8 print " and " END { print "!!\n" } print "World\n" exit! BEGIN { print "Hello" } exit! [takeken@localhost ~]$ ruby hoge.rb Hello and World
・こんなのもありでオモロイ。
CのPrintfの記述式が使える。
irb(main):002:0> printf("%.10f\n", Math.sqrt(2)) 1.4142135624 => nil
・エンコードにも色々あるらしい
ファイルじたいの文字コードもあり、色々と奥が深い。
p Encoding.default_external #デフォルト外部エンコーディング p Encoding.default_internal #デフォルト内部エンコーディング p Encoding.locale_charmap #現在のロケール
これで少しはまとまった情報になったかな。
たまーに見直すときだったりにまた見返せるといいな。