jjzjj

ruby - 当子元素不是数组时,在 splat 参数之后需要可选的关键字参数

根据这个post,在splat参数之后可以有一个可选的关键字参数。如果splat参数正在引入一个数组数组,这会起作用,但当它是一个散列数组时则不起作用例如,如果被调用的方法定义为defcall(*scores,alpha:nil)putsscoresend那么这就可以了scores=[[1,2],[3,4]]call(*scores)但这不是scores=[{a:1},{b:3}]call(*scores)给出以下内容(使用ruby​​2.4.4)ArgumentError:unknownkeyword:b但这行得通scores=[{a:1},{b:3}]call(*scores,al

arrays - 为什么 Hash#merge 使用 splat 运算符返回哈希数组数组而不是哈希数组?

长话短说我通过反复试验解决了这个问题,但我对splat运算符和pp方法如何始终给我一个与我认为的不同的对象的理解显然存在差距。我想了解这个差距,并确定一种更好的方法来合并哈希数组。我也希望将来能够更有效地调试这类事情。首先是代码示例和调试步骤。我半满意的解决方案和更详细的问题在底部。代码我正在使用MRIRuby2.6.2。给定Foo类,我希望Foo#windows返回合并的散列。这是该类的一个最小示例:classFooattr_reader:windowsdefinitialize@windows={}enddefpry{pry:"stuffpry\r"}enddefirb{irb:"

ruby - 为什么非显式 splat 参数加上默认参数是 Ruby 1.9 中方法定义的错误语法?

我想问一下为什么在Ruby-1.9.3-p0中有一个带有默认值分配的splatparam1和一个param2,如下所示:defmy_method(*param1,param2="default");结尾返回SyntaxError:(irb):1:语法错误,意外的'=',期待')'我的解决方法是明确地将param1括在括号中,如下所示:defmy_method((*param1),param2="default");结尾非常感谢 最佳答案 Ruby无法在splat之后解析带有默认值的参数。如果您在splat后的参数中有默认赋值,Rub

ruby - 这种使用 splat 运算符的并行赋值在 Ruby 中如何工作?

letters=["a","b","c","d","e"]first,*second=lettersfirst#=>"a"second#=>"["b","c","d","e"]我明白这会产生什么,但无法理解这一点。这基本上是Ruby魔法吗?想不出任何其他编程语言会支持这种带有splat运算符的赋值。 最佳答案 这在函数式语言中很常见,所以Ruby并不孤单。您有一个项目列表,并希望将其分隔为head和tail,这样您就可以对列表的第一个元素执行操作。这也有效:letters=["a","b","c","d","e"]first,*mi

ruby - 为什么这个 splat 方法调用在 Ruby 中不起作用?

defmethod(a,b='a',c,*d)[a,b,c,d]endpmethod(1,2,3,4)不工作,我不明白为什么,如果我们删除b参数一切正常。语法规则说您可以将具有默认值的参数放在splat参数之前。 最佳答案 只要具有默认值的变量可以被解释为(唯一的)splat的初始元素,具有默认值的变量和splat变量就可以存在并共存。因此,这些都可以工作:defgood(a=:a,b);[a,b];enddefgood(a=:a,*b);[a,b];enddefgood(a,b=:b,*c);[a,b,c];end但这些不会:de

ruby - 使用 splat 运算符通过引用将参数传递给 block

似乎在使用splat运算符通过引用将参数传递给block时复制了参数。我有这个:defmethoda=[1,2,3]yield(*a)paendmethod{|x,y,z|z=0}#=>thisputsandreturns[1,2,3](didn'tmodifiedthethirdargument)如何通过引用传递这些参数?如果我直接传递数组似乎可行,但splat运算符在这里会更加实用、直观和可维护。 最佳答案 在Ruby中,当您编写x=value时,您正在创建一个新的局部变量x无论它之前是否存在(如果它存在,名称就是反弹,原始值保

ruby - 为什么要使用 splat 运算符来创建哈希?

我正在学习RubyMonk教程。有一个部分处理splat运算符,以及如何将它与哈希一起使用。这是有效代码:putsHash[4,8]putsHash[[[4,8],[15,16]]]但是它说你也可以使用:ary=[[4,8],[15,16],[23,42]]putsHash[*ary.flatten]为什么有人会使用最后一种创建哈希的形式,而不是直接执行Hash[ary]? 最佳答案 有几种方法可以初始化哈希。您可以传递给它成对的数组或只列出键和值。文档中的示例:Hash["a",100,"b",200]#=>{"a"=>100,"

ruby - 为什么在这里的数组定义中使用了 splat?

definitialize(apps,catch=404)@apps=[];@has_app={}apps.each{|app|addapp}@catch={}[*catch].each{|status|@catch[status]=true}end在这个方法中来自Rack::Cascade,splat(*)在[*catch]代码中的作用是什么?我认为在方法参数中使用了splat来指示您何时将拥有未指定数量的参数。splat在这里有不同的含义吗? 最佳答案 它为catch创建一个平面数组我不确定是否有人完全理解splat运算符。很多

ruby - 将 splat 传递给 nil 作为参数

下面b的所有值让我可以使用*args语法调用方法。defsome_method(a)putsaendb=1some_method(*b)#=>1b=falsesome_method(*b)#=>falseb="whatever"some_method(*b)#=>"whatever"使用nil,我希望得到nil,而不是参数错误:b=nilsome_method(*b)#=>ArgumentError:wrongnumberofarguments(0for1)这里发生了什么? 最佳答案 splat运算符*首先将to_a应用于对象,如果

ruby - 为什么在 *a = ""之前调用 p 时,splat/一元运算符会更改分配的值 a ?

就我如何理解这个问题给出一些背景信息。在字符串上使用splatcollect将:to_a或:to_ary发送到字符串classStringdefmethod_missingmethod,*args,&blockpmethod#=>:to_arypargs#=>[]pblock#=>nilendend*b="b"所以我想重新定义:to_ary方法就是我所追求的。classStringdefto_ary["to_a"]endendp*a="a"#=>"a"pa#=>"a"*b="b"pb#=>["to_a"]现在这让我很困惑。打印*a="a"的结果会改变分配给a的值吗?进一步证明class