代码之家  ›  专栏  ›  技术社区  ›  bryantsai

如何使用define_方法指定方法默认参数?

  •  32
  • bryantsai  · 技术社区  · 15 年前

    define_method 可用于定义方法:

    define_method(:m) do |a|
    end
    

    相当于:

    def m(a)
    end
    

    但是,下面使用的等效形式是什么 定义方法 :

    def m(a=false)
    end
    

    注意我需要打电话 m() 没有任何争论。

    2 回复  |  直到 12 年前
        1
  •  45
  •   molf    15 年前

    这实际上就像你在Ruby1.9中所期望的那样工作!

    define_method :m do |a = false|
    end
    

    如果您需要1.8兼容性,但不一定需要一个闭包来定义方法,请考虑使用 class_eval 使用字符串参数和对 def :

    class_eval <<-EVAL
      def #{"m"}(a = false)
      end
    EVAL
    

    否则,按照菲利普链接的线索中的建议进行操作。例子:

    define_method :m do |*args|
      a = args.first
    end
    
        2
  •  5
  •   philant    14 年前

    这是目前不可能的 due to the yacc parser . This thread on Ruby-forum 提出了几种解决方案。

    class A
         define_method(:hello) do | name, *opt_greeting|
            option = opt_greeting.first || Hash.new
            greeting = option[:greeting] || "hello"
            puts greeting+" "+name
         end
    end
    
    
    a = A.new
    a.hello "barbara"
    a.hello "Mrs Jones", :greeting => "Good Morning"