例如,考虑squares=*map((2).__rpow__,range(5)),squares#(0,1,4,9,16)*squares,=map((2).__rpow__,range(5))squares#[0,1,4,9,16]所以,在其他条件相同的情况下,我们会在左对齐时得到一个列表,在右轴上喷射时得到一个元组。为什么?这是设计使然,如果是,其基本原理是什么?或者,如果没有,是否有任何技术原因?还是就是这样,没有什么特别的原因? 最佳答案 您在RHS上获得一个元组的事实与splat无关。splat只是解压缩您的map迭代器。
使用Sinatra,我可以通过以下方式将多个“未知”参数传递给路由:get'/say/*/to/*'do#matches/say/hello/to/worldparams[:splat]#=>["hello","world"]end如何在Espresso中做同样的事情? 最佳答案 Espresso中的路由是常规的Ruby方法。因此,如果该方法在Ruby中有效,则该路由将在Espresso中有效。Ruby免费提供您想要实现的目标。只需定义一个带有预定义参数的Ruby方法:require'e'classAppsayhellotoworl
案例陈述:casexwhen1"one"when2"two"when3"three"else"many"end使用===运算符计算。此运算符在when表达式的值上调用,并将case表达式的值作为参数。上面的case语句等效于以下内容:if1===x"one"elsif2===x"two"elsif3===x"three"else"many"end在这种情况下:A=1B=[2,3,4]casereasonwhenAputs"busy"when*Bputs"offline"endwhen*B部分不能改写为*B===2。这是关于splat运算符的吗?splat运算符是关于赋值,而不是比较。c
在构造函数中,经常会发生将参数转换为实例变量的情况。一个天真的方法是:classAdefinitializea,b,c@a,@b,@c=a,b,cendend但更简单的方法是:classAdefinitialize*args@a,@b,@c=argsendend但我担心代码的速度,因为看起来后面的代码正在创建一个额外的数组args,而这不是在前面的代码中创建的。从速度或效率的角度来看,是坚持前者好还是不用后者好,还是没有区别? 最佳答案 从这里看起来不错:RUBY_VERSION#=>"1.9.3"defset_each(a,b,c
我最近遇到了这个splat运算符的例子:first,*,last=1,2,*[3,4,5]它奏效了。所以我想知道,您能否在左侧或右侧多次使用splat运算符?每次我这样做时都会遇到意想不到的星号错误,但我只是想知道到底是怎么回事。 最佳答案 左侧不能有多个splat。(至少不是在同一层级的嵌套。)毕竟,这意味着“吞噬所有值”,那么两个splats甚至意味着是什么意思?它只是没有意义。注意:这样的事情当然是可能的:a,*b,(c,*d)=[1,2,3,[4,5,6]]两个splats处于不同层次的嵌套,互不干扰。右边也没有问题:a=1
我们创建一个带有splatted参数的方法,并在其上调用Method#parameters:defsplatter(x,*y,z);endparams=method(:splatter).parameters#=>[[:req,:x],[:rest,:y],[:req,:z]]我正在寻找一个函数f,它将参数列表映射到它们相应的变量名称上。该函数应该足够灵活,可以处理任何其他带有任意放置的splat参数的方法。例如:args=[:one,:two,:three,:four]f(params,args)#=>[[:x,:one],[:y,:two],[:y,:three],[:z,:fou
我想允许用户将一个选项传递给一个方法,该方法可以是单个对象或数组。下面的代码工作,假设`opts[:variable_length_opt]被定义:definitialize(opts={})@ivar=*opts[:variable_length_opt]end但如果未设置该选项,我也希望能够设置默认值。但是这段代码不起作用:definitialize(opts={})@ivar=(opts[:variable_length_opt]?*opts[:variable_length_opt]:default_value)end它会抛出一个unexpectedtSTAR错误。我知道还有其
我想为数组创建一个方法来获取数组的splat作为返回。在Ruby中可以做到这一点吗?例如这是我当前的代码:Array.module_evaldodefto_argsreturn*selfendend我希望[1,2,3].to_args返回1,2,3但它最终返回[1,2,3] 最佳答案 您不能从Ruby返回“splat”。但是你可以返回一个数组,然后自己拼写它:defargs[1,2,3]endx,y,z=args#x==1#y==2#z==3x,*y=args#x==1#y==[2,3]当然,这适用于任何数组,所以真的没有必要让猴子
要编写splat运算符的自定义结果,必须实现to_a方法。String类的示例:classStringdefto_aself.split//endendirb>res=*'text'=>["t","e","x","t"]但是如果没有上面的monkeypatch,String类对to_a方法一无所知:irb>String.respond_to?:to_a=>false所以问题是,在标准“未打补丁”的字符串对象上应用splat运算符时会调用什么方法?irb>res=*'text'=>['text'] 最佳答案 首先:调用String.r
我无法想出一个很好的方法来访问带有splat运算符中提供的键名的多维哈希-有什么建议吗?例子:我有一个像这样的哈希{'key'=>'value','some'=>{'other'=>{'key'=>'othervalue'}}}和一个函数定义deffoo(*args)我想返回foo('key')value和foo('some','other','key')其他值。我所能想出的全部都是相当长且丑陋的for循环,其中包含大量nil?检查,而且我确信我错过了一种更像ruby的方式来做到这一点又好又短。任何提示表示赞赏。更新使用Patrick的回复下面,我想出了deffoo(hash,*a