ruby再入門した雑感
何年か前にrubyやりますという宣言をしてちょこちょこ他人のコードを読んだりしていたのだけど 結局身につかず、身の回りのスクリプトを書く時は結局手慣れたperlで書いちゃうみたいなことをしていました。
ここ暫く業務の引き継ぎを兼ねて新しくスクリプト書いたりしていたんですが、perlで書いたコードの引き継ぎが大変(PHPerは居るがPerlerは私しかいない)なこともあって改めてrubyで書いてみたりするにつれやはりruby良いよねと思うように。最近はperlを封印する勢いでrubyでコードを書いています。
以前の切り替えが上手く行かなかったのはやはり自分でrubyのコードを書かなかったことがあり、その原因は「とりあえずperlで書いちゃう」以外に「そもそもrubyの文法を理解していない」ということがありました。今回はミニツクというサイトで半日ほどe-learningを受講して基本的なコードは書けるようにしたお陰で手が動かせるようになったので、それなりに切り替えが上手くいってると思います。
rubyに移行した感想は細かい部分を挙げると色々ありますが、一例としてはクラス作るのが楽ですね。
例えばperlの場合
package MyClass; use strict; sub new{ my $class = shift; my $args = shift || {}; my $self = {}; for my $key ( keys %{$args} ){ if( $key == qw/ user / ){ $self->{$key} = $args->{$key} } } bless $self; } sub getUserName{ my $self = shift; $self->{'user'} }
と長くなってしまうのですが、
これをrubyで書いた場合
class MyClass attr_reader :user def initialize( args ) @user = args[ :user ] || nil end end
のようにかなり簡素に書くことが出来ます。
あとはハッシュの扱いも楽ですね。 perlだと
%hash = ( 'key1' => 'val1' )
もしくは
%hash = ( 'key1' , 'val1' )
となりますが、rubyだとsymbolを用いて
hash = { :key, 'val1' }
(ruby1.8.7では動きましたがruby2.2では動きませんでした)
もしくは
hash = { key: 'val1' }
のように書けます。タイピングが楽ですし、keyとvalueが分かりやすくて良いです。
参照する際もperlなら
for my $key (keys %hash){ my $value = $hash{$key}; if( $value eq 'val1' ){ print "$key: $value" } }
のように書いたりしますが、rubyであれば
hash.each do | key, value | if value == 'val1' puts "#{key}: #{value}" end end
のように書けます。
あとは
- scalar, array, hashでそれぞれ$, @, %と変数記号を使い分けないといけない、特にデリファレンス時に面倒くさい
- 行末のセミコロンがないとエラーになる
といった制約から開放されたのも地味に良かったです。 (perl書いてる時は別に普通だと思っていたんですが、、、)
毎日コード書いてる専業プログラマなら問題ないのかもしれませんが、私はコードを書くのは本業ではないのでオーバーヘッドは少なければ少ないほど良いですね(コード書く度にスイッチングコストが発生してしまうので)
実際、一ヶ月ぶりにperlのコード書いただけで疲れました。。。
今のところとりあえずPerlerがrubyの文法を学んだだけで我流で書いているので、「rubyならこう書けるよ」的なところがわからずわりと力技で書いていたりしますが、そこはおいおい他の人のコードを読む機会があれば学習していきたいと思います。