match, text, number = *"foobar 123".match(/([A-z]*) ([0-9]*)/)
Run Code Online (Sandbox Code Playgroud)
我知道这是在进行某种正则表达式匹配,但是splat在这里扮演什么角色,有没有办法在没有splat的情况下这样做,所以它不那么令人困惑?
我想允许用户将选项传递给可以是单个对象或数组的方法.假设`opts [:variable_length_opt]被定义,下面的代码可以工作:
def initialize(opts={})
@ivar = *opts[:variable_length_opt]
end
Run Code Online (Sandbox Code Playgroud)
但是如果没有设置选项,我也希望能够设置默认值.但是这段代码不起作用:
def initialize(opts={})
@ivar = (opts[:variable_length_opt] ? *opts[:variable_length_opt] : default_value)
end
Run Code Online (Sandbox Code Playgroud)
它抛出一个unexpected tSTAR错误.我知道还有其他更冗长的方法来完成我所追求的目标,但我想知道是否有其他的,简短的替代方案.另外,splat的限制是什么?我想不出有一个很好的理由,它应该在这里不可用.
我正在研究Ruby Koans的about_message_passing.rb,并使代码适用于method_missing,如下所示:
def method_missing(method_name, *args, &block)
@messages << method_name
@object.__send__(method_name, *args, &block)
end
Run Code Online (Sandbox Code Playgroud)
这段代码似乎有效,但我不太明白为什么需要*args中的splat和块中需要&.
如果我正在定义一个方法,我理解*和&分别用于表示数组参数和块参数,但是当它们与send方法一起使用以调用对象上的方法时,它意味着什么?
我想要做的是:
logged_in = {
'logged_in': True,
'username' : 'myself',
}
print render_template('/path/to/template.html',
**logged_in,
title = 'My page title',
more = 'even more stuff',
)
Run Code Online (Sandbox Code Playgroud)
但这不起作用.有没有什么办法来组合一个字典扩张有明确的参数,或者我需要在第二个字典定义明确的参数,合并两个,扩大结果呢?
说我有
arr = [1,2,3]
Run Code Online (Sandbox Code Playgroud)
如何更改此方法以便将每个参数添加到数组中?
def add(*number)
arr << *number
end
Run Code Online (Sandbox Code Playgroud)
所以add(4,5,6)产生:
arr #=> [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud) Ruby的splat运算符*可用于合并
def one_argument(*a)
...
end
one_argument(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
或拆分
def multiple_arguments(a, b, c)
...
end
multiple_arguments(*[1, 2, 3])
Run Code Online (Sandbox Code Playgroud)
多个值,具体取决于上下文.
是否有可能创建一个充当"反向splat"运算符的方法?为了反过来,运营商必须满足:
inverse_splat(*(foo)) == foo
Run Code Online (Sandbox Code Playgroud)
和
*(inverse_splat(foo)) == foo
Run Code Online (Sandbox Code Playgroud) 我需要编写一个方法,它接受一个未知数量的参数(因此*splat)但是它传递了一个yields_with_args规范.
代码:
def eval_block(*args, &block)
raise "NO BLOCK GIVEN!" if block.nil?
block.call(args)
end
Run Code Online (Sandbox Code Playgroud)
rspec:
it "passes the arguments into the block" do
expect do |block|
eval_block(1, 2, 3, &block)
end.to yield_with_args(1, 2, 3)
end
end
Run Code Online (Sandbox Code Playgroud)
它工作,但它产生*splat创建的数组:[1,2,3]vs 1,2,3,因此不传递rspec.是否有另一种方法通过Ruby中的方法传递多个参数?
在 PowerShell 中,您可以将多个参数传递给函数或 cmdlet,方法是将它们包装在一个哈希表变量中,然后传递前缀为@而不是 的变量$。
是否可以使用哈希表作为另一个对象的属性(即作为一个衬垫)?例如,下面我首先必须将属性 ( testInt, testString)分配给另一个变量,然后才能将其分配给Demo. 我想要一些方法来避免这个额外的步骤,但一直无法找到一个巧妙的解决方案......
function Demo {
[CmdletBinding()]
Param (
[Parameter()]
[string]$One
,
[Parameter()]
[string]$Two
)
"1 = $One"
"2 = $Two"
}
$test = @{
testInt = @{
One = '1'
Two = '2'
}
testString = @{
One = 'One'
Two = 'Two'
}
}
$t = $test.testInt
Demo @t
$t = $test.testString
Demo @t
Demo @test.testInt #this doesn't work / I've also tried …Run Code Online (Sandbox Code Playgroud) 是否有一些函数或语法结构使下一个例子有效?
Hash#values_at使用Array参数调用函数:
h = {"a" => 1, "b" => 2, "c" => 3}
ary = ["a", "b"]
h.values_at(*ary) # Error: argument to splat must be a tuple, not Array(String)
Run Code Online (Sandbox Code Playgroud)
传递Hash给初始化类或结构:
struct Point
def initialize(@x : Int32, @y : Int32)
end
end
h = {"x" => 1, "y" => 2}
Point.new(**h) # Error: argument to double splat must be a named tuple, not Hash(String, Int32)
Run Code Online (Sandbox Code Playgroud) 这是rubeque.com上给出的一个简单问题:编写一个接受任意数量整数的方法,如果总和为21,则将它们添加为true.否则返回False.它测试输入:
assert_equal twenty_one?(3, 4, 5, 6, 3), true
assert_equal twenty_one?(3, 11, 10), false
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所拥有的:
def twenty_one?(*nums)
nums.inject(&:+)
end
if twenty_one? == 21
puts true
else
false
end
Run Code Online (Sandbox Code Playgroud)
但我收到错误消息:
RuntimeError: The value '21' does not equal 'true'.
Run Code Online (Sandbox Code Playgroud)
我真的很困惑如何解决这个问题.是否可以将if/else语句放在方法中?如果这个问题非常基本,那就很抱歉.我是编程新手.