我刚看到这个例子,其中splat运算符在方法定义中单独使用:defprint_pair(a,b,*)puts"#{a}and#{b}"endprint_pair(1,2,3,:cake,7)#=>1and2很清楚在这样的上下文中使用什么以及为什么要使用它:defarguments_and_opts(*args,opts)puts"arguments:#{args}options:#{opts}"endarguments_and_opts(1,2,3,a:5)#=>arguments:[1,2,3]options:{:a=>5}但是为什么以及如何在第一个示例中使用它?既然它是在Ruby规
所以我浏览了Traiblazer和Reform文档,我经常看到这种代码classAlbumForm注意到defpopulate_songs!(fragment:,**)定义了吗?我很清楚双splat命名参数(如**others)捕获所有其他关键字参数。但我从未见过没有名字的**。所以我的两个问题是:上面方block中的**是什么意思?为什么要使用这种语法? 最佳答案 whatdoes**meanintheblockabove?这是一个kwsplat,但没有指定名称。因此,此方法将接受任意一组关键字参数并忽略除:fragment之外的
match,text,number=*"foobar123".match(/([A-z]*)([0-9]*)/)我知道这是在做某种正则表达式匹配,但是splat在这里扮演什么角色,有没有办法在没有splat的情况下做到这一点,这样就不会那么困惑了? 最佳答案 splat将正则表达式匹配结果(一个包含三组的MatchData:整个模式、字母和数字)分解为三个变量。所以我们最终得到:match="foobar123"text="foobar"number="123"如果没有splat,将只有一个结果(MatchData),因此Ruby不
在方法调用中展开空数组有效地将参数减少为空(为清楚起见添加了空括号):deffoo()enddefbar(*args)foo(*args)endbar(1)#ArgumentError,asexpectedbar()#works但这同样不适用于散列参数:defbaz()enddefqux(**opts)baz(**opts)endqux#ArgumentError,**optsbecomes{}我可以通过显式检查空哈希来解决这个问题:defquux(callable,**opts)ifopts.empty?callable.()elsecallable.(**opts)endendc=
给定这个方法定义:deffoo(a=nil,b:nil)pa:a,b:bend当我使用单个散列参数调用该方法时,散列总是隐式转换为关键字参数,而不管**:hash={b:1}foo(hash)#=>{:a=>nil,:b=>1}foo(**hash)#=>{:a=>nil,:b=>1}我可以传递另一个(空)散列作为解决方法:foo(hash,{})#=>{:a=>{:b=>1},:b=>nil}但是,这看起来很笨拙。我原以为Ruby会像处理数组一样处理这个问题,即:foo(hash)#=>{:a=>{:b=>1},:b=>nil}foo(**hash)#=>{:a=>nil,:b=>1
这个问题在这里已经有了答案:Keywordargumentsunpacking(splat)inRuby(3个答案)关闭5年前。这个想法类似于你在python中使用装饰器所做的事情,我不知道该方法需要什么参数,所以我传递*args,**kwargs作为一般情况当我想将空散列作为kwargs传递给不带参数的方法时,问题就出现了defmy_method'Ihaveruncorrectly'endargs=[]kwargs={}my_method*args,**kwargs=>ArgumentError:wrongnumberofarguments(given1,expected0)有趣的是
我正在分配一个这样的数组常量:NUMS=*(2..9)Rubocop说C:卡住分配给常量的可变对象。NUMS=*(2..9)^^^^^所以我试试NUMS=*(2..9).freezeRubocop说C:卡住分配给常量的可变对象。NUMS=*(2..9).freeze^^^^^^^^^^^^尝试过NUMS=(*(2..9)).freezeRubocop说E:意外的标记tRPAREN(使用Ruby2.0解析器;在AllCops下使用TargetRubyVersion参数进行配置)NUMS=(*(2..9)).freeze^尝试过NUMS=[1,2,3,4,5,6,7,8,9].freeze
根据这个post,在splat参数之后可以有一个可选的关键字参数。如果splat参数正在引入一个数组数组,这会起作用,但当它是一个散列数组时则不起作用例如,如果被调用的方法定义为defcall(*scores,alpha:nil)putsscoresend那么这就可以了scores=[[1,2],[3,4]]call(*scores)但这不是scores=[{a:1},{b:3}]call(*scores)给出以下内容(使用ruby2.4.4)ArgumentError:unknownkeyword:b但这行得通scores=[{a:1},{b:3}]call(*scores,al
长话短说我通过反复试验解决了这个问题,但我对splat运算符和pp方法如何始终给我一个与我认为的不同的对象的理解显然存在差距。我想了解这个差距,并确定一种更好的方法来合并哈希数组。我也希望将来能够更有效地调试这类事情。首先是代码示例和调试步骤。我半满意的解决方案和更详细的问题在底部。代码我正在使用MRIRuby2.6.2。给定Foo类,我希望Foo#windows返回合并的散列。这是该类的一个最小示例:classFooattr_reader:windowsdefinitialize@windows={}enddefpry{pry:"stuffpry\r"}enddefirb{irb:"
我想问一下为什么在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