我不完全理解Ruby 2.0中的命名参数是如何工作的.

def test(var1, var2, var3)
  puts "#{var1} #{var2} #{var3}"
end

test(var3:"var3-new", var1: 1111, var2: 2222) #wrong number of arguments (1 for 3) (ArgumentError)

它被当作杂烩.这很有趣,因为在Ruby 2.0 I must中使用命名参数会为它们设置默认值:

def test(var1: "var1", var2: "var2", var3: "var3")
  puts "#{var1} #{var2} #{var3}"
end

test(var3:"var3-new", var1: 1111, var2: 2222) # ok => 1111 2222 var3-new

这与Ruby以前使用默认参数值时的行为非常相似:

def test(var1="var1", var2="var2", var3="var3")
  puts "#{var1} #{var2} #{var3}"
end

test(var3:"var3-new", var1: 1111, var2: 2222) # ok but ... {:var3=>"var3-new", :var1=>1111, :var2=>2222} var2 var3

我知道为什么会发生这种情况,以及它是如何工作的.

但我只是好奇,如果我使用命名参数,我会使用默认值作为参数吗?

那么,有谁能告诉我这两者有什么区别吗?

def test1(var1="default value123")
  #.......
end

def test1(var1:"default value123")
  #.......
end

推荐答案

你发布的最后一个例子具有误导性.我不同意这种行为与以前的行为相似.最后一个示例将参数哈希作为第一个可选参数传入,这是另一回事!

如果不想使用默认值,可以使用nil.

如果你想读一本好书,请看"Ruby 2 Keyword Arguments".

Ruby相关问答推荐

Rbenv说未安装已安装的版本

如何在 Ruby 中为链表实现#pop

在 ruby​​ 中提取文档中的主题标签和部分

Ruby ERB 类给出未定义的局部变量或方法,但 erb 解析良好

如何使用正则表达式在字符串中查找特定匹配项

Rspec: expectvsexpect什么区别?

您如何将 Cucumber 场景标记为待处理

Ruby 中的发送方法

object_id 分配如何工作?

就地修改 ruby​​ 哈希(rails strong params)

Ruby 与计算机科学相关的 yield 特性

Ruby 被空格分割

无法在 Windows 上安装 Aptana Studio 3.6

使用 Ruby 将大写字符串转换为标题大小写

是否有更简单的(单行)语法来别名一个类方法?

创建一个接受参数散列的 ruby​​ 方法

`File` 对象访问模式的区别(即 w+, r+)

何时在 Ruby 中使用 `require`、`load` 或 `autoload`?

为依赖于环境变量的代码编写规范的最佳方法是什么?

查找模块中可用的类