草庐IT

splat-list

全部标签

ruby - splat 参数后的可选参数

这是我的程序:defcalculate(*numbers,options={})add(numbers)ifoptions[:add]subtract(numbers)ifoptions[:add]==falseenddefadd(*numbers)numbers.reduce(:+)enddefsubtract(*numbers)numbers.reduce(:-)endpcalculate(1,2)在第一行,它在提示tests.rb:1:syntaxerror,unexpected'=',expecting')'defcalculate(*numbers,options={})__

ruby - Double-splat 运算符破坏性地修改哈希值——这是 Ruby 错误吗?

我注意到我发现Ruby2.1.1中的**(double-splat)运算符有一个非常令人惊讶的行为。当在**hash之前使用键值对时,hash保持不变;但是,当仅在**hash之后使用键值对时,哈希将被永久修改。h={b:2}{a:1,**h}#=>{a:1,b:2}h#=>{b:2}{a:1,**h,c:3}#=>{a:1,b:2,c:3}h#=>{b:2}{**h,c:3}#=>{b:2,c:3}h#=>{b:2,c:3}为了比较,请考虑数组上单*运算符的行为:a=[2][1,*a]#=>[1,2]a#=>[2][1,*a,3]#=>[1,2,3]a#=>[2][*a,3]#=>[

ruby - FactoryGirl create_list 传入多个值

如果我有这个工厂:factory:product,class:Productdoname{Faker::Commerce.product_name}description{Faker::Lorem.paragraph}price{Faker::Number.number(3)}end我可以使用create_list创建2个这样的产品:FactoryGirl.create_list(:product,2)但我想将默认值传递给我的两个产品,我会假设理论上是这样的吗?prods=[{:name=>"Product1"},{:name=>"Product2"}]FactoryGirl.crea

ruby - 了解范围和数组中的 ruby​​ splat

我试图理解*(1..9)和[*1..9]之间的区别如果我将它们分配给变量,它们的工作方式相同splat1=*(1..9)#splat1=[1,2,3,4,5,6,7,8,9]splat2=[*1..9]#splat2=[1,2,3,4,5,6,7,8,9]但是当我尝试直接使用*(1..9)和[*1..9]时,事情变得很奇怪。*(1..9).map{|a|a.to_s}#syntaxerror,unexpected'\n',expectingtCOLON2or'['or'.'[*1..9].map{|a|a.to_s}#["1","2","3"...]我猜部分问题出在运算符的优先级上?但

ruby - splat 运算符在没有变量名时会做什么?

我在浏览Camping代码库时看到一个带有splat的构造函数,如下所示:classFruitdefinitialize(*)endend我试着在这个网站和谷歌上查找“splatwithnovariablename”,但除了关于splat与像这样的变量名一起使用的信息之外,我找不到任何东西*some_var,但是不是没有它。我试着在repl上玩这个,我试过类似的东西:classFruitdefinitialize(*)puts*endendFruit.new('boo')但是遇到这个错误:(eval):363:(eval):363:compileerror(SyntaxError)(e

ruby - Splat 在哈希上

散列上的splat将其转换为数组。[*{foo::bar}]#=>[[:foo,:bar]]这里是否存在某种隐藏机制(例如隐式类转换),或者它是一种内置的原始特征?除了数组,nil和hash是唯一在Ruby1.9下随splat运算符消失/改变的东西吗? 最佳答案 splat将尝试将对象显式转换为数组。为此,它将发送to_a并期望得到一个Array。classFoodefto_a[1,2,3]endenda,b,c=*Foo.newa#=>1如果对象不响应to_a,则没有效果,例如[*42]==[42]许多内置类实现to_a。特别是:

ruby - 如何同时使用 splat 和可选哈希在 ruby​​ 中定义方法?

这个问题在这里已经有了答案:Optionalargumentaftersplatargument(6个答案)关闭8年前。我可以这样定义一个方法:deftest(id,*ary,hash_params)#Dostuffhereend但这使得hash_params参数成为强制性的。这些也不起作用:deft(id,*ary,hash_params=nil)#SyntaxError:unexpected'=',expecting')'deft(id,*ary,hash_params={})#SyntaxError:unexpected'=',expecting')'有没有办法让它成为可选的?

ruby - 如何在 Ruby 中为 splat 参数设置默认值

为splat参数设置默认值会产生错误:1.9.3-p374:001>defab,*c=nil1.9.3-p374:002?>endSyntaxError:(irb):1:syntaxerror,unexpected'=',expecting';'or'\n'defab,*c=nil^from/Users/me/.rvm/rubies/ruby-1.9.3-p374/bin/irb:16:in`'我尝试过的一些变体也不起作用:1.9.3-p374:003>defab,*c=[]1.9.3-p374:005>defab,(*c)=nil1.9.3-p374:007>defab,(*c=[]

ruby - 我在 "gem list"中看到 gem 但有 "no such file to load"

我在Ubuntu10上sudoapt-getinstallruby1.9.1-full然后下载rubygem1.3.7的源码并安装sudorubysetup.rb然后,例如,安装sinatrasudogeminstallsinatra最后打开irb并输入require"rubygems"require"sinatra"得到错误LoadError:nosuchfiletoload--sinatrafrom(irb):2:in`require'from(irb):2from/usr/bin/irb:12:in`' 最佳答案 我正好遇到了

ruby - 如何将数组传递给接受带有 splat 运算符的属性的方法?

如果我有这样的方法:defsum*numbersnumbers.inject{|sum,number|sum+=number}end我怎样才能将数组作为数字传递?ruby-1.9.2-p180:044>sum1,2,3#=>6ruby-1.9.2-p180:045>sum([1,2,3])#=>[1,2,3]请注意,我无法更改sum方法以接受数组。 最佳答案 只是在调用方法的时候放一个splat吗?sum(*[1,2,3]) 关于ruby-如何将数组传递给接受带有splat运算符的属性的