Ruby 2.0 中的命名参数(关键字参数)

红薯 发布于 2012/10/08 18:27
阅读 3K+
收藏 10

开源软件供应链点亮计划,等你来!>>>

来自维基百科:在计算机编程语言中,命名参数或者叫做关键字参数指的是计算机语言支持为函数调用的每个参数定义一个专门的名称。

现在 (我指的是 Ruby <= 1.9.3) 你可以通过传递参数的哈希值到指定方法来模仿这个行为:

def foo(options = {})
  puts "#{options[:bar]} #{options[:buz]}"
end

foo(bar: 'bar', buz: 'buz') # => 'bar buz'

我敢打赌你一定见过很多这种用法,但主要的问题是这种方法你很难轻松地为某个参数设置一个默认值,当然你可以这样处理:

def foo(options = {})
  options = {bar: 'bar'}.merge(options)
  puts "#{options[:bar]} #{options[:buz]}"
end

foo(buz: 'buz') # => 'bar buz'

但看起来不是一种漂亮的解决方法,那么 Ruby 2.0 会对此作何改变呢?从 Ruby 的 CHANGELOG 可以看到:

实现了关键字参数,该功能将在 2.0 中提供,详细的方案还在讨论中。

听起来很有希望,你将可能在 Ruby 的语法中看到关键字参数,那么该如何使用呢?这里有很多的测试,我们找一些出来看看:

只包含关键字参数:
def foo(str: "foo", num: 424242)
  [str, num]
end

foo(str: 'buz', num: 9) #=> ['buz', 9]
foo(str: 'bar') # => ['bar', 424242]
foo # => ['foo', 424242]
foo(bar: 'buz') # => ArgumentError

正如你所看到的,你不需要做合并或者其他额外的工作来实现参数默认值,而如果你给的参数不匹配将会收到一个 ArgumentError 错误,像 Rails 通过 assert_valid_keys 方法扩展的 Hash 类

使用关键字参数的普通参数

def foo(x, str: "foo", num: 424242)
  [x, str, num]
end

foo(13) #=> [13, 'foo', 424242]
foo(13, str: 'bar') #=> [13, 'bar', 424242]

关键字参数和选项

def foo(str: "foo", num: 424242, **options)
  [str, num, options]
end

foo #=> ['foo', 424242, {}]
foo(check: true) # => ['foo', 424242, {check: true}]

你看到了又一个 ** 的新字符串,允许你传递哈希到方法:

def foo(str: "foo", num: 424242, options = {})
  [str, num, options]
end

这将无法运行,你会收到错误 syntax error, unexpected ')', expecting end-of-input.

也可以在块中运行

define_method(:foo) {|str: "foo", num: 424242| [str, num] }

还是让我们翘首以待 Ruby 2.0 的发布把。

英文原文OSCHINA原创翻译

加载中
0
恺哥
恺哥
感觉现在ruby(RoR)没以前那么火了,现在大家的目光都在mobile上
0
李惟
李惟

引用来自“恺哥”的答案

感觉现在ruby(RoR)没以前那么火了,现在大家的目光都在mobile上
ruby是做什么的呢?
李惟
李惟
回复 @lidashuang : 那不是JAVA吗:)
lidashuang
lidashuang
回复 @李惟 : ruby很全面,都可以的。
翟志军
翟志军
使用ruby,你会很快乐
李惟
李惟
回复 @William Herry @恺哥 : 还是不懂他的特色是什么,RUBY可能不像PHP、JS、C\C++那样能够一句话就概括出鲜明特色来的吧
恺哥
恺哥
想更多的了解Ruby,上其官网看看吧,没墙。不过用Ruby写东西,心理一定要念叨“DYD是中国的”
下一页
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部