argius note

プログラミング関連

Rubyの標準ライブラリをPureJavaで書いてみる (2)

懲りずに続けてみます。
クラス名の衝突を先頭3文字にして回避してみましたが、ちょっと格好悪い。

  • Strクラス:Stringのwrapper。Enumerableを実装してる。
  • Numericクラス:数値のスーパークラス。自動変換(できるだけ)。
    • Intクラス:Integerのwrapper。当面はBigIntegerのwrapper。
    • Floクラス:Floatのwrapper。当面はBigDecimalのwrapper。

本体は今回もありません。出し渋っているわけではなく、まだ未完成すぎて今後も大幅に変更があるのが濃厚なためです。

Rubyで書いた場合。

class Numeric # 内部表現出力
  def inner
    self.class.to_s + "(#{self})"
  end
end

"abcd".split(//).each do |item|
  puts item
end
puts "A".center(10, "*")
n = 5 + 8
puts "n = #{n} # #{n.inner}"
n = n + 1.5
puts "n = #{n} # #{n.inner}"

Javaの方。

import static lib.ruby.Kernel.*;
import lib.ruby.*;
import lib.ruby.Enumerable.*;

public final class Main {
    public static void main(String[] args) {
        s("abcd").split("").each(new Callable<Str>() {
            public void call(Str element) {
                System.out.println(element);
            }
        });
        System.out.println(s("A").center(10, "*"));
        Numeric n = i(5).add(n(8));
        System.out.println("n = " + n.toNumber() + " # " + n);
        n = n.add(f(1.5f));
        System.out.println("n = " + n.toNumber() + " # " + n);
    }
}

両方の結果。

$ ruby test.rb
a
b
c
d
****A*****
n = 13 # Fixnum(13)
n = 14.5 # Float(14.5)
$ java Main
a
b
c
d
****A*****
n = 13 # Numeric(13, BIGINT)
n = 14.5 # Numeric(14.5, BIGDECIMAL)
$