Ruby Ruby 2.0 的新参数写法

huacnlee · 2012年10月08日 · 最后由 yakjuly 回复于 2012年11月03日 · 4599 次阅读

http://brainspec.com/blog/2012/10/08/keyword-arguments-ruby-2-0/

以前

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

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

Ruby 2.0

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

乍一看,从以前的版本变为现在的版本,让人有点不知所措。 但是如果不看老版本的话,新的写法非常的人性化呀!喜欢这样的人性化设计,在方法内处理传入的参数更加顺手了。

以前的方式得写熟悉了才能运用的很好,并且以前的方式对于允许的参数描述不够清晰,别人来阅读接口的时候会比较困难

新的方式直接看定义就能明白

感觉有点长得像 objective-c 了

不错不错。。只是估计 Ruby 新手要头疼了..

一直觉得这是 Objective-C 比 Ruby 要人性化的地方,没想到这么快就吸收过来了,太棒了!

啥时候发布呢?

#4 楼 @jjym 有啥好头疼的啊,一看就懂

不错的,只能说越来越人性化了

不太喜欢这个语法糖。

#6 楼 @mobiwolf 应该是 ruby 的 20 周年发布

像个 Hash,其实也应该是吧。fun(a,b,c) 要接收的就是:a=>x,:b=>y,:c=>z。2.0 的写法更清晰了。

#7 楼 @huacnlee 一个刚学 ruby 的人,他要搞清楚 (a),(a=1),(*options),(a:1),(**options) 这些,还有传参时的顺序。对于习惯的人来说没什么,对于大多数新手应该不会一看就懂。

更期待 ruby 控制猴子补丁的特性

Ruby 可以用来做幼儿园编程教学了,好可爱的语法啊

不爽,容易与这个混淆。 def foo(str=111, num=22)

匿名 #15 2012年10月09日

这是个 smalltalk 基本的特性,小小语法糖,会大大的增加代码可读性。

命名参数确实便利很多

加了一种定义方式啊,调用方式没变。

增加了一点便利。但也增加了学习难度。

#17 楼 @sevk 难度没变吧,只是跟以前的定义不兼容了。

新的不能使用

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

options 不能设为 Hash 了。是前面用了命名参数之后不能再设 Hash 参数,还是怎么滴,需要更多说明。如果没有用命名参数(大量现有的库),Hash 参数还能不能用,需不需要改写。

#18 楼 @Rei 应该还可以接受,但是意味着以前的“伪命名参数”和现在的做法只能二选一了

keyword argument is a very normal feature. Ruby should use it more earlier.

@jjym (**options) ruby 有这种用法吗?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号