带有可选选项和&block参数的Ruby方法

丹尼·穆勒(Denny Mueller)
  1. 是否可以将可选属性和块作为方法调用的参数?

    示例:我必须打电话

    method(foo, foo: bar, -> { do_something }
    

    并尝试了

    def method(foo, *bar, &block)
    end
    

    就我的理解而言,区块始终必须位于最后位置?

    经过一番研究,我发现一元(?)*似乎适用于数组。由于我尝试通过a,因此Hash将代码更改为

    def method(foo, bar={}, &block)
    end
    

    但这也不能解决问题。我猜是因为他不知道酒吧的终点和街区的起点。

    有什么想法或建议吗?先感谢您

    追加:只是出于好奇,为什么我需要这个。我们运行着一个大的json模式,并有一个小的DSL,它可以根据模型定义来构建json。在不赘述的情况下,我们想实现exportable_scopes。

    class FooBar
      exportable_scope :some_scope, title: 'Some Scope', -> { rewhere archived: true }
    end
    

    在某些初始化程序上,这应该发生:

    def exportable_scope scope, attributes, &block
      scope scope block
      if attributes.any?
        attributes.each do |attribute|
          exportable_schema.scopes[scope] = attribute
        end
      else
        exportable_schema.scopes[scope] = {title: scope}
      end
    end
    

    因此,这工作正常,我只需要提示方法参数即可。

布鲁诺·法卡

对的,这是可能的。

当混合不同种类的参数时,必须按特定顺序将它们包含在方法定义中:

  1. 位置参数(必需和可选)和单个splat参数(以任何顺序排列);
  2. 关键字参数(必填和可选),按任意顺序;
  3. Double splat参数;
  4. 块参数(以&前缀);

上面的顺序有些灵活。我们可以定义一个方法,并从一个splat参数开始,然后是几个可选的位置参数,等等,开始参数列表。即使Ruby允许这样做,通常也是非常糟糕的做法,因为代码将很难阅读甚至难以调试。通常最好使用以下顺序:

  1. 所需的位置参数;
  2. 可选的位置参数(具有默认值);
  3. 单个splat参数;
  4. 关键字参数(必填和可选,它们的顺序无关紧要);
  5. Double splat参数;
  6. 显式块参数(以&前缀)。

例子:

def meditate cushion, meditation="kinhin", *room_items, time: , posture: "kekkafuza", **periods, &b
    puts "We are practicing #{meditation}, for #{time} minutes, in the #{posture} posture (ouch, my knees!)."
    puts "Room items: #{room_items}"
    puts "Periods: #{periods}"
    b.call # Run the proc received through the &b parameter
end

meditate("zafu", "zazen", "zabuton", "incense", time: 40, period1: "morning", period2: "afternoon" ) { puts "Hello from inside the block" }

# Output:
We are practicing zazen, for 40 minutes, in the kekkafuza posture (ouch, my knees!).
Room items: ["zabuton", "incense"]
Periods: {:period1=>"morning", :period2=>"afternoon"}
Hello from inside the block

请注意,在调用该方法时,我们有:

  • 提供了垫子强制性仓位论证;
  • 覆盖冥想可选位置参数的默认值;
  • 通过* room_items参数传递了几个额外的位置参数(zabuton和香);
  • 提供了时间强制关键字参数;
  • 省略了姿态可选关键字参数;
  • 通过** periods参数传递了几个额外的关键字参数(period1:“上午”,period2:“下午”);
  • 通过&b参数传递了{

请注意上面服务器的示例,只是为了说明混合不同类型参数的可能性。在实际代码中构建这样的方法将是一种不好的做法。如果一个方法需要那么多参数,最好将其拆分为较小的方法。如果绝对有必要将大量数据传递给单个方法,则我们可能应该创建一个类,以一种更有条理的方式存储数据,然后将该类的实例作为单个参数传递给该方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么带有splat参数的Ruby proc / block的行为与方法和lambda的行为不同?

来自分类Dev

带有Python Click库选项的可选CLI参数

来自分类Dev

ExpressibleByStringLiteral,函数参数中带有可选项

来自分类Dev

Python argparse:带有可选和位置参数的互斥参数

来自分类Dev

带有可选项和类型转换的错误

来自分类Dev

javascript函数是否应该具有可选参数和选项?

来自分类Dev

javascript函数是否应该具有可选参数和选项?

来自分类Dev

带有可选参数的Django HTTPResponseRedirect和Reverse

来自分类Dev

RedirectView和带有可选参数的url反向

来自分类Dev

带有可选参数的Django HTTPResponseRedirect和Reverse

来自分类Dev

带有可选参数的RedirectView和url反向

来自分类Dev

带有非选项和选项参数的脚本

来自分类Dev

带有可选参数的 RewriteRule

来自分类Dev

如何动态调用带有可选参数的方法?

来自分类Dev

PHP 中带有 $this 的类方法中的可选参数

来自分类Dev

编写带有可选参数的 REST 包装函数的 Pythonic 方法

来自分类Dev

Java 8 中带有可选参数的调用方法

来自分类Dev

带有可选选项的结构的大小

来自分类Dev

带有uri参数和表单数据的Ruby Net :: HTTP删除方法

来自分类Dev

传递带有参数的方法作为ruby中的参数

来自分类Dev

带有POST方法和参数的BackgroundTransferService

来自分类Dev

可选参数和方法重载

来自分类Dev

ELISP交互功能,带有前缀参数和用户输入作为可选参数

来自分类Dev

具有可选参数的方法

来自分类Dev

工厂模式-带有可选参数

来自分类Dev

带有可选参数的DSL语法

来自分类Dev

带有可选块参数的子例程

来自分类Dev

带有可选查询参数的Sinatra

来自分类Dev

带有HttpResponseRedirect的Django可选视图参数

Related 相关文章

  1. 1

    为什么带有splat参数的Ruby proc / block的行为与方法和lambda的行为不同?

  2. 2

    带有Python Click库选项的可选CLI参数

  3. 3

    ExpressibleByStringLiteral,函数参数中带有可选项

  4. 4

    Python argparse:带有可选和位置参数的互斥参数

  5. 5

    带有可选项和类型转换的错误

  6. 6

    javascript函数是否应该具有可选参数和选项?

  7. 7

    javascript函数是否应该具有可选参数和选项?

  8. 8

    带有可选参数的Django HTTPResponseRedirect和Reverse

  9. 9

    RedirectView和带有可选参数的url反向

  10. 10

    带有可选参数的Django HTTPResponseRedirect和Reverse

  11. 11

    带有可选参数的RedirectView和url反向

  12. 12

    带有非选项和选项参数的脚本

  13. 13

    带有可选参数的 RewriteRule

  14. 14

    如何动态调用带有可选参数的方法?

  15. 15

    PHP 中带有 $this 的类方法中的可选参数

  16. 16

    编写带有可选参数的 REST 包装函数的 Pythonic 方法

  17. 17

    Java 8 中带有可选参数的调用方法

  18. 18

    带有可选选项的结构的大小

  19. 19

    带有uri参数和表单数据的Ruby Net :: HTTP删除方法

  20. 20

    传递带有参数的方法作为ruby中的参数

  21. 21

    带有POST方法和参数的BackgroundTransferService

  22. 22

    可选参数和方法重载

  23. 23

    ELISP交互功能,带有前缀参数和用户输入作为可选参数

  24. 24

    具有可选参数的方法

  25. 25

    工厂模式-带有可选参数

  26. 26

    带有可选参数的DSL语法

  27. 27

    带有可选块参数的子例程

  28. 28

    带有可选查询参数的Sinatra

  29. 29

    带有HttpResponseRedirect的Django可选视图参数

热门标签

归档