HYLOGICS

今後は各分室にコンテンツを移して、ここは雑記や暮らしを中心としたライフログ的な何かにしていく予定です。

ruby再入門した雑感

何年か前にrubyやりますという宣言をしてちょこちょこ他人のコードを読んだりしていたのだけど 結局身につかず、身の回りのスクリプトを書く時は結局手慣れたperlで書いちゃうみたいなことをしていました。

ここ暫く業務の引き継ぎを兼ねて新しくスクリプト書いたりしていたんですが、perlで書いたコードの引き継ぎが大変(PHPerは居るがPerlerは私しかいない)なこともあって改めてrubyで書いてみたりするにつれやはりruby良いよねと思うように。最近はperlを封印する勢いでrubyでコードを書いています。

以前の切り替えが上手く行かなかったのはやはり自分でrubyのコードを書かなかったことがあり、その原因は「とりあえずperlで書いちゃう」以外に「そもそもrubyの文法を理解していない」ということがありました。今回はミニツクというサイトで半日ほどe-learningを受講して基本的なコードは書けるようにしたお陰で手が動かせるようになったので、それなりに切り替えが上手くいってると思います。

ミニツク - Rubyのe-ラーニング研修システム

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ならこう書けるよ」的なところがわからずわりと力技で書いていたりしますが、そこはおいおい他の人のコードを読む機会があれば学習していきたいと思います。