💨

一日一処: 「時は金なり」をRubyで表現するとちゃんとした英語っぽくなって興奮する

2024/02/25に公開2

時は金なり

前回は、JavaScriptで表現したが、JavaScriptだと、やたら記号が多かったりと、文章というには程遠い。だが、英文法に寄せることのできるRubyだと、もっと文章チックに表現ができる。

準備

class Time
  def is(value)
    value.class == Money
  end
end

class Money
end

2つのクラスを用意した。Timeクラスには、isメソッドを追加し、引数として与えられたもののクラスがMoneyクラスだった場合、真を返す。
文章っぽくしたいので、sayメソッドも準備しておく。

def say(msg)
  puts msg
end

英文っぽく

それぞれをインスタンス化し、以下のように利用すると、英文っぽく表現できた。

class Time
  def is(value)
    value.class == Money
  end
end

class Money
end

def say(msg)
  puts msg
end

time = Time.new
money = Money.new

say "Time is Money." if time.is money
# Time is Money.

しかし、say "Time is Money." if time.is moneyを読んでいると、AはAである、のような文章になっていて、これもすこし面白い。
英文に寄せたとしても、やはり、邪魔になる記号が残ってしまう。これは仕方ないが、逆に、プログラムらしさを最大に引き出す方法として、こういうのもいいだろう。

演算子オーバーロード

class Time
  def ==(value)
    value.class == Money
  end
end

# 省略

say "Time is Money." if time == money

Rubyでは、クラスにおいて、演算子オーバーロードが可能だ。そのため、==を用いて、評価させることもできる。

Discussion

砂漠砂漠

putsをsayに置き換えたいならaliasでもよさそう

鳥生 甚句鳥生 甚句

意見ありがとうございます!
たしかにそうですね、aliasの方が文字数もスッキリするので、そちらのほうが良かったかもしれません。