Lightweight Language Lovers

PythonとRubyを比較してみる(Rubyによるコーディング 準備編)

さて、いきなりで恐縮ですが、Python版とは全然違った書き方をしています。 :-?
どのみちこの程度のプログラムなら、Pythonのソースに構文的な修正さえ行えばたぶん動いてくれることでしょう。
それに、以下のプログラムは JRuby (*) では動いてくれないので、いずれ書き直す必要があります。
(*)最終的には Java とRuby の連携を目指しているため、JRuby の使用を前提に考えています。

それより、ここでの目的は Ruby の言語としての特徴をつかむことにあります。

その印象ですが、まず感じたのは

ということでした。

確かに、Ruby は初めてということもありますが、それにしてもPythonの

に馴染んでいただけに違いが際立っていまい、書くときはいろいろと戸惑いました。
しかし、四苦八苦しているうちに馴染んでくると、「意外と読みやすい」、いや 「ドキュメント性が高いのでは」と思うようになってきました。

書く時に苦労して、後で理解しやすく記述することができる。と言えるのかも知れません。

例えばループですが、Python ではほとんどの場合、 for ... in ... の構文を使います。 これは書きやすさと整然としたソースをもたらし、誰が書いても同じようなプログラムになって保守性が高まるという効果をもたらしていると思います。

これに対して、Ruby では、10.times {...}、Range().each {...}などいろいろな書き方ができます。
これは語彙が豊富ということであり、場面に応じて表現を変えてプログラムをより読みやすくする、といったようなことができ、優秀なプログラマの「表現欲」のようなものを満たしてくれるのではないでしょうか。
これが海外の著名なプログラマがRubyに魅かれる理由の一つのような気がします。

「一つのことをやるのに様々な方法がある」といえばPerlの有名な

が思い浮かびますが、こちらは語彙よりは省略記法が豊かであるような気がします。

一つのことをやるのに、

に対して、

何となく母国語の違いが出ているような気がします。

class SjisChars
  
  $KCODE = "SJIS"
  KU13 = 0x8740..0x879c
  KU89_92 = 0xED40..0xEEFC
  KU115_9 = 0xFA40..0xFC4B
  GAIJI = 0xF040..0xF9FC
  
  def initialize(chars)
    @chars = chars
    @reKisyu = mkRegexp(KU13, KU89_92, KU115_9)
    @reGaiji = mkRegexp(GAIJI)
  end
  
  def mkRegexp(*ra)
    ra.map! {|r| "[%s-%s]" % [[r.first].pack("n"), [r.last].pack("n")]}
    Regexp.compile(ra.join("|"))
  end
  
  def scanSjis
    @chars.split(//).each {|c| yield c, isKanji(c), isGaiji(c), isKisyu(c)}
  end
  
  def isKanji(c)
    c.length == 2
  end
  
  def isGaiji(c)
    @reGaiji.match(c) != nil
  end
  
  def isKisyu(c)
    @reKisyu.match(c) != nil
  end
  
  def hexprint
    scanSjis do |c, isKanji, isGaiji, isKisyu|
      h = (c.unpack("n")[0] if isKanji) || c.unpack("C")[0]
      attr = ("Gaiji" if isGaiji) || ("Kisyu" if isKisyu) || ""
      printf("%s %x %s\n", c, h, attr)
    end
  end
      
end
  
sc = SjisChars.new("abc漢字・・①㈱纊彧德羽裵錞德鍈ⅰ黑")
sc.hexprint
sc.scanSjis do |c, k, g, ki|
  printf("%s %s %s %s\n", c, k, g, ki)
end


CategoryPython CategoryRuby