假设我有一个函数可以从其他对象组合一个对象,并且我将参数传递给该函数 - 最初是一个对象文字,然后是我想要组合的对象以扩展该对象:
composeFunc({}, obj1, obj2, obj3);
传递的 args 数量是可选的,然后我如何将 args 传递给 Object.assign() 从第二个 arg 开始。因此该函数将类似于以下内容:
function composeObj(objs) {
return Object.assign(arguments[1], arguments[2], arguments[3]... etc);
}
提前致谢:)
最佳答案
如果您使用的是 ES2015 而不仅仅是垫片,您可以使用扩展符号、Array.from 和slice:
function composeObj(objs) {
return Object.assign(...Array.from(arguments).slice(1));
}
或者直接使用 slice 而不是在 Array.from 之后:
function composeObj(objs) {
return Object.assign(...Array.prototype.slice.call(arguments, 1));
}
...见Thomas' answer使用剩余参数,因为这是在 ES2015 中执行此操作的正确方法。
如果你不使用 ES2015,你可以通过 apply 只用填充 Object.assign 做同样的事情:
function composeObj(objs) {
return Object.assign.apply(Object, Array.prototype.slice.call(arguments, 1));
}
在那里,我们使用 Function#apply 而不是扩展运算符(因为 ES5 和更早版本没有扩展运算符)。 Function#apply 在调用期间使用第一个参数作为 this 调用你调用它的函数,并使用你给它的数组(或类似数组的东西)作为第二个参数作为调用的参数。
假设你有:
obj.foo(1, 2, 3);
使用 Function#apply 的等价物是:
obj.foo.apply(obj, [1, 2, 3]);
第一个参数 obj 告诉 apply 在调用期间将什么用作 this。第二个参数是要使用的参数数组。
但如果您使用扩展运算符,则没有必要,它将类似数组的操作数扩展为离散参数。
关于javascript - 将函数参数传递给 Object.assign,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36662741/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option