例
> [0, 1, 2].permutation(2){|perm| p perm} [0, 1] [0, 2] [1, 0] [1, 2] [2, 0] [2, 1] => [0, 1, 2]
実行例
> [0, 1, 2].repeated_permutation(2){|perm| p perm} [0, 0] [0, 1] [0, 2] [1, 0] [1, 1] [1, 2] [2, 0] [2, 1] [2, 2] => [0, 1, 2] > [0, 1, 2].repeated_combination(2){|comb| p comb} [0, 0] [0, 1] [0, 2] [1, 1] [1, 2] [2, 2] => [0, 1, 2]
小町算
['+', '-', '*', '/', '']. repeated_permutation(8). each {|a, b, c, d, e, f, g, h| s = "1#{a}2#{b}3#{c}4#{d}5#{e}6#{f}7#{g}8#{h}9" n = eval s if n == 100 then p s end }
(割り切れない除算はふつう除外するが、ここではそれは重要でないので対応していない)
具体的にテストコードで
(このコードは TestModule というクラスの中にある)
class ModuleCurrentTestModule1 CURRENT = Module.current def self.foo Module.current end def foo Module.current end end def test_module_current assert_equal(TestModule, Module.current) assert_equal(ModuleCurrentTestModule1, ModuleCurrentTestModule1::CURRENT) assert_equal(ModuleCurrentTestModule1, ModuleCurrentTestModule1.foo) module_current_test = ModuleCurrentTestModule1.new assert_equal(ModuleCurrentTestModule1, module_current_test.foo) foo = ModuleCurrentTestModule1.module_eval{Module.current} assert_equal(ModuleCurrentTestModule1, foo) foo = ModuleCurrentTestModule1.instance_eval{Module.current} assert_equal( "#<Class:TestModule::ModuleCurrentTestModule1>", foo.to_s) end
あるいは、簡単なサンプルとその実行結果を示す(追加)
# サンプル p "A #{Module.current}" module Foo p "B #{Module.current}" end class Bar p "C #{Module.current}" def m p "D #{Module.current}" end end bar = Bar.new bar.m Foo.module_eval {p "E #{Module.current}"} Foo.instance_eval {p "F #{Module.current}"} bar.instance_eval {p "G #{Module.current}"}
以下実行結果
"A Object" "B Foo" "C Bar" "D Bar" "E Foo" "F #<Class:Foo>" "G #<Class:#<Bar:0x00000801b59fd8>>"
(最後のが特異クラス)