标签: splat

splat在这做什么?

match, text, number = *"foobar 123".match(/([A-z]*) ([0-9]*)/)
Run Code Online (Sandbox Code Playgroud)

我知道这是在进行某种正则表达式匹配,但是splat在这里扮演什么角色,有没有办法在没有splat的情况下这样做,所以它不那么令人困惑?

ruby splat

3
推荐指数
1
解决办法
581
查看次数

为什么使用Ruby 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 splat

3
推荐指数
1
解决办法
573
查看次数

Ruby Koans关于传递"发送"块和参数的消息

我正在研究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方法一起使用以调用对象上的方法时,它意味着什么?

ruby methods block send splat

3
推荐指数
1
解决办法
2397
查看次数

你能否将关键字参数扩展与常规关键字参数结合起

我想要做的是:

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)

但这不起作用.有没有什么办法来组合一个字典扩张有明确的参数,或者我需要在第二个字典定义明确的参数,合并两个,扩大结果呢?

python splat keyword-expansion

2
推荐指数
1
解决办法
2086
查看次数

与 splat ruby​​ 连接

说我有

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

2
推荐指数
1
解决办法
634
查看次数

是否有可能在Ruby中反转splat?

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)

ruby operators inverse splat

2
推荐指数
1
解决办法
299
查看次数

有没有一种方法没有(*)splat参数在Ruby中传递多个参数?

我需要编写一个方法,它接受一个未知数量的参数(因此*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中的方法传递多个参数?

ruby rspec splat

2
推荐指数
1
解决办法
282
查看次数

将函数与对象的属性相结合

在 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)

powershell splat powershell-5.0

2
推荐指数
1
解决办法
1164
查看次数

有没有办法在Crystal中使用带有splat运算符的非元组对象?

是否有一些函数或语法结构使下一个例子有效?

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)

splat crystal-lang

2
推荐指数
1
解决办法
164
查看次数

ruby:当总和为21时,添加数字并打印为true

这是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语句放在方法中?如果这个问题非常基本,那就很抱歉.我是编程新手.

ruby sum splat

1
推荐指数
1
解决办法
124
查看次数