jjzjj

ruby - 为什么使用 Ruby splat 会引发错误?

我想允许用户将一个选项传递给一个方法,该方法可以是单个对象或数组。下面的代码工作,假设`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错误。我知道还有其

ruby - 如何从 Ruby 中的方法返回一个 splat

我想为数组创建一个方法来获取数组的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]当然,这适用于任何数组,所以真的没有必要让猴子

ruby - 字符串上的 Splat(星号)运算符

要编写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

ruby - 使用 splat 参数从多维哈希中获取

我无法想出一个很好的方法来访问带有splat运算符中提供的键名的多维哈希-有什么建议吗?例子:我有一个像这样的哈希{'key'=>'value','some'=>{'other'=>{'key'=>'othervalue'}}}和一个函数定义deffoo(*args)我想返回foo('key')value和foo('some','other','key')其他值。我所能想出的全部都是相当长且丑陋的for循环,其中包含大量nil?检查,而且我确信我错过了一种更像ruby​​的方式来做到这一点又好又短。任何提示表示赞赏。更新使用Patrick的回复下面,我想出了deffoo(hash,*a

ruby - Ruby 中使用的独立 splat 运算符 (*) 是什么?

我刚看到这个例子,其中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规

ruby-on-rails - 在此代码示例中,double splat (**) 参数是什么意思,为什么要使用它?

所以我浏览了Traiblazer和Reform文档,我经常看到这种代码classAlbumForm注意到defpopulate_songs!(fragment:,**)定义了吗?我很清楚双splat命名参数(如**others)捕获所有其他关键字参数。但我从未见过没有名字的**。所以我的两个问题是:上面方block中的**是什么意思?为什么要使用这种语法? 最佳答案 whatdoes**meanintheblockabove?这是一个kwsplat,但没有指定名称。因此,此方法将接受任意一组关键字参数并忽略除:fragment之外的

ruby - splat 在这里做什么?

match,text,number=*"foobar123".match(/([A-z]*)([0-9]*)/)我知道这是在做某种正则表达式匹配,但是splat在这里扮演什么角色,有没有办法在没有splat的情况下做到这一点,这样就不会那么困惑了? 最佳答案 splat将正则表达式匹配结果(一个包含三组的MatchData:整个模式、字母和数字)分解为三个变量。所以我们最终得到:match="foobar123"text="foobar"number="123"如果没有splat,将只有一个结果(MatchData),因此Ruby不

ruby - 我怎样才能将双重 splat 参数折叠成空?

在方法调用中展开空数组有效地将参数减少为空(为清楚起见添加了空括号):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=

ruby - 通过 ruby​​ 中的双 splat 传递空哈希

这个问题在这里已经有了答案:Keywordargumentsunpacking(splat)inRuby(3个答案)关闭5年前。这个想法类似于你在python中使用装饰器所做的事情,我不知道该方法需要什么参数,所以我传递*args,**kwargs作为一般情况当我想将空散列作为kwargs传递给不带参数的方法时,问题就出现了defmy_method'Ihaveruncorrectly'endargs=[]kwargs={}my_method*args,**kwargs=>ArgumentError:wrongnumberofarguments(given1,expected0)有趣的是

ruby rubocop : how to freeze an array constant generated with splat

我正在分配一个这样的数组常量: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