首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby 2中的命名参数

Ruby 2中的命名参数
EN

Stack Overflow用户
提问于 2013-03-09 06:54:49
回答 9查看 105.2K关注 0票数 55

我不完全理解Ruby2.0中的命名参数是如何工作的。

代码语言:javascript
运行
复制
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)

就像哈希一样。这很有趣,因为要在Ruby2.0i中使用命名参数,必须为它们设置默认值:

代码语言:javascript
运行
复制
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以前使用默认参数值时的行为非常相似:

代码语言:javascript
运行
复制
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

我知道为什么会发生这种事,也知道它是如何运作的。

但是我很好奇,如果我使用命名的参数,必须,我必须使用参数的默认值吗?

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

代码语言:javascript
运行
复制
def test1(var1="default value123")
  #.......
end

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

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-03-09 10:27:56

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

如果不希望具有默认值,则可以使用nil

如果你想读一篇好的文章,请看"Ruby 2关键字参数“。

票数 24
EN

Stack Overflow用户

发布于 2013-09-17 18:19:45

我认为你最新问题的答案可以用明确的例子来解释。在下面的示例中,您可以以显式顺序获得可选参数:

代码语言:javascript
运行
复制
def show_name_and_address(name="Someone", address="Somewhere")
  puts "#{name}, #{address}"
end

show_name_and_address
#=> 'Someone, Somewhere'

show_name_and_address('Andy')
#=> 'Andy, Somewhere'

命名参数方法是不同的。它仍然允许您提供默认值,但它允许调用方确定要提供哪些参数(如果有的话):

代码语言:javascript
运行
复制
def show_name_and_address(name: "Someone", address: "Somewhere")
  puts "#{name}, #{address}"
end

show_name_and_address
#=> 'Someone, Somewhere'

show_name_and_address(name: 'Andy')
#=> 'Andy, Somewhere'

show_name_and_address(address: 'USA')
#=> 'Someone, USA'

虽然这两种方法在没有参数的情况下确实是相似的,但是当用户向方法提供参数时,它们是不同的。使用命名参数,调用方可以指定要提供的参数。具体来说,最后一个示例(仅提供地址)在第一个示例中是不完全可以实现的;您只能通过向方法提供两个参数才能得到类似的结果。这使得命名参数方法更加灵活。

票数 79
EN

Stack Overflow用户

发布于 2015-05-30 04:08:15

Ruby2.1.0开始,您不再需要为指定的参数设置默认值。如果省略参数的默认值,则将要求调用方提供该参数。

代码语言:javascript
运行
复制
def concatenate(val1: 'default', val2:)
  "#{val1} #{val2}"
end

concatenate(val2: 'argument')
#=> "default argument"

concatenate(val1: 'change')
#=> ArgumentError: missing keyword: val2

给予:

代码语言:javascript
运行
复制
def test1(var1="default value123")
  var1
end

def test2(var1:"default value123")
  var1
end

当没有通过一个论点时,他们的行为也会是一样的:

代码语言:javascript
运行
复制
test1
#=> "default value123"

test2
#=> "default value123"

但是,当一个参数被传递时,它们的行为会有很大的不同:

代码语言:javascript
运行
复制
test1("something else")
#=> "something else"

test2("something else")
#=> ArgumentError: wrong number of arguments (1 for 0)


test1(var1: "something else")
#=> {:var1=>"something else"}

test2(var1: "something else")
#=> "something else"
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15308163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档