一种少见的 Ruby 传参方法

我们都知道,Ruby 支持多种传参方法,最常见的就是必选参数,可选参数,带默认值的参数以及命名参数。
举个例子:

  def mm a, b=2, *c
    p [a, b, c]
  end

这个方法定义了一个必选参数,一个带默认值的参数以及一个可选参数,让我们运行这个方法试试:

mm(1)                                      # =>  [1, 2, []]
mm(1,10)                                   #  =>  [1, 10, []]
mm(1, 10, 20, 21)                         #=>  [1, 10, [20, 21]]

再来让我们试试命名参数:

def nn a: 3, b: 4
  p [a, b]
end

然后来运行一下:

nn                      # =>  [3, 4]
nn(a: 10)                # =. [10, 4]

然而有这么一种情况:我们想使用命名参数,但又不想提供默认值,即调用函数时必须传入该参数,这个时候该怎么办呢?
让我们来看看下面这个函数:

def special(a:, b:2)
  p [a, b]
end

注意,第一个参数 a 后面没有任何值,这看起来视乎有点怪异,那我们来测试一下:

special b: 4                              # => ArgumentError: missing keyword: a
special a: 12, b: 10                      #=> [12, 10]
special 12, b: 10                        # => ArgumentError: wrong number of arguments (given 1, expected 0)

大家可以发现, a 是一个必选参数,并且传参的时候也必须以哈希的方式传入。这种传参方式比较少见,但确实适用于想用命名参数方式传参又要强迫调用者必须传入该参数的情况。这个小技巧大家 get 到了吗?

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,355评论 2 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 10,552评论 1 32
  • 第5章 函数和函数式编程 5.1 引言函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数...
    VIVAFT阅读 790评论 0 5
  • 图二是来自小沫姐的 挺喜欢小猫的,今天临摹了一下
    大玲子201118阅读 56评论 2 0
  • 海生是你的名, 你是大海的孩子, 像浪花般声势浩大的拍岸而来, 却选择静寂地退去。 亚洲铜布满了青锈, 面朝大海,...
    禾必阅读 108评论 0 1
  • 01 感觉生活过得跟布朗运动一样,不是醒着拼就是闭着熬。不知道自己一天天想干什么,在干什么,干了什么。 没有方向,...
    雷垒阅读 1,097评论 10 30
  • 奔跑 必须最快到达 跳跃 以箭的速度 猎场 就是厮杀 防备 危险随时出现 小心 陷阱就在眼前 现在 没人能救我 怯...
    巫师小白阅读 355评论 0 3
  • 只要智商低,天天过六一!
    阿珍你阅读 108评论 1 0