代码之家  ›  专栏  ›  技术社区  ›  Mads Mobæk

对Ruby中方法参数的思考

  •  0
  • Mads Mobæk  · 技术社区  · 14 年前

    学习以下课程:

    class Automator
      def fill_specific_form(fields)
        fields.each_pair do |key, value|
          puts "Setting '#{key}' to '#{value}'"
        end
      end
    end
    
    a = Automator.new
    a.fill_specific_form :first_name => "Mads", :last_name => "Mobæk"
    
    # => Setting 'first_name' to 'Mads'
    # => Setting 'last_name' to 'Mobæk'
    

    在没有哈希的情况下也可以这样做吗?因为所有参数都是必需的,所以我需要一个具有以下签名的方法:

    fill_specific_form(first_name, last_name)
    

    在我看来,通过让方法体对其参数进行反射和迭代,从而实现相同的结果,这是可能的。

    您将如何实现这一点?这种模式/习惯用法是否已经存在?两个明显的好处是IDES中的参数信息,不必检查是否提供了所有哈希键。

    我想避免的是:

    puts "Setting first_name to #{first_name}"
    puts "Setting last_name to #{last_name}"
    # and so on
    
    3 回复  |  直到 12 年前
        1
  •  3
  •   sepp2k    12 年前

    如果在方法中没有设置其他局部变量, local_variables 将为您提供方法参数名的列表(如果您设置了其他变量,则可以调用 局部变量 首先要记住结果)。这样你就可以随心所欲了 局部变量 + eval :

    class Automator
      def fill_specific_form(first_name, last_name)
        local_variables.each do |var|
          puts "Setting #{var} to #{eval var.to_s}"
        end
      end
    end
    
    Automator.new().fill_specific_form("Mads", "Mobaek")
    

    但要注意这是纯粹的邪恶。

    至少以你为例

    puts "Setting first_name to #{first_name}"
    puts "Setting last_name to #{last_name}"
    

    似乎更明智。

    你也可以 fields = {:first_name => first_name, :last_name => last_name} 在方法的开始,然后使用 fields.each_pair 代码。

        2
  •  0
  •   Daniel O'Hara    14 年前

    我不太明白。是否要在单个数组中接收所有参数?

    def fill_specific_form *args
        #Process args
    end
    
        3
  •  0
  •   Jörg W Mittag    14 年前

    反思方法(或 Proc 's)参数,可以使用 Proc#parameters , Method#parameters UnboundMethod#parameters :

    ->(m1, o1=nil, *s, m2, &b){}.parameters
    # => [[:req, :m1], [:opt, :o1], [:rest, :s], [:req, :m2], [:block, :b]]
    

    但是,在你的情况下,我不明白为什么你需要反思,因为你 已经知道 参数的名称。