トップ «前の日記(2009-06-20) 最新 次の日記(2009-06-22)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2009-06-21

_ Ruby初心者への間違ったアドバイスを書いてみる

Rubyにはリストがありません。だから自分で作らなければなりません。

class List
  def initialize(x, lis)
    @car = x
    @next = lis
  end
  attr_accessor :car
  def cdr
    @next
  end
end

ここでリストの長さを求める処理を追加したいとします。

コーディング・スタイルは典型的な「自転車置き場の議論」なのでそれほど気にする必要はないと思いますが、良く見られる例では、

def size_of(lis)
  if lis.nil?
    0
  else
    1 + size_of(lis.cdr)
  end
end

のようにListの長さを求める処理を書いているのですが、実際には

def size_of(lis)
  if lis.nil?
    0
  else
    1 + size_of(lis.cdr)
  end; end

のようにendは最後にまとめて書くことが多いです。Rubyistのコードブロックの認識は、実はPythonistaに近いんじゃないかなと思っています。

しかし、もっと良いRubyistのコードは、

class List
  def size_of()
    if self.nil?
      0
    else
      1 + cdr.size_of
    end; end; end

のように、オープンクラスを利用して、インスタンスメソッドに書きなおすことです。Rubyistのメソッドの認識は、実はPythonistaに近いんじゃないかなと思っています。

ただ、この場合の問題は、このメソッドが正しく終了判断できないことです。

Scheme初心者へのアドバイスを書いてみる』にインスパイアされて何か書いてみたくなったのだが、あまりにくだらなくなってしまったので、バグを入れることにしてみた。

_ 解決編

以下のコードを追加する。
class NilClass
  def size_of
    0
  end; end

2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|

ジェズイットを見習え