Rubyで「1 < x < 10 」みたいな書き方をしてみる

Pythonみたく

if 1 < x < 10
  puts "#{x}は1から10の間!"
else
  puts "#{x}は1から10の間じゃない"
end

みたいにかけるようにしてみた。
「1 < x < 10 < y < 100」みたいに続けてもOK
但し、返ってくるのは、数字 か false 。
Range使うより少し楽?

#pyltgt.rb

class FalseClass
	def < (v); false end
	def > (v); false end
	def <= (v); false end
	def >= (v); false end
	# def =~ (v); false end
end

[Fixnum, Bignum, Float].each do
	|klass|
		klass.class_eval do
			alias_method(:pylg_old_lt, :<)
			alias_method(:pylg_old_gt, :>)
			alias_method(:pylg_old_elt, :<=)
			alias_method(:pylg_old_egt, :>=)
			def < (v);  v && pylg_old_lt(v)  ? v : false end
			def > (v);  v && pylg_old_gt(v)  ? v : false end
			def <= (v); v && pylg_old_elt(v) ? v : false end
			def >= (v); v && pylg_old_egt(v) ? v : false end
			# def =~ (v); v && self.==(v)      ? v : false end
		end
end


if $0 == __FILE__ 
	require 'test/unit'

	class TC_Test < Test::Unit::TestCase
		def test_test
			assert_equal false,   1 < 1
			assert_equal false,   1 < 1
			assert_equal 2,       1 < 2
			assert_equal 1,       -1 < 0 < 1
			assert_equal 1,       -1 <= 0 < 1
			assert_equal 1,       -1 <= 0 <= 1
			assert_equal 1,       -1 <= 1 <= 1
			assert_equal false,   -1 <= 1 > 1
			assert_equal 1,       -1 <= 2 > 1
			assert_equal 2,       -1 <= 2 >= 2
			assert_equal false,   3 <= 2 <= 3
			# assert_equal false,   1 < 2 =~ 3
			# assert_equal false,   1 < (2 =~ 3) < 4
			# assert_equal 4,       1 < (2 =~ 2) < 4
			# assert_equal 4,       1 < 2 =~ 2 < 4  # 演算子の優先順位の関係で fail
		end
	end
end