除了模仿溅射运算符之外,是否有更简单的替代方法?
我发现它在Ruby中可用,但是我从Python所做的事情中认识到它. " Splat"操作员.长话短说,我想知道是否有一种更简单的方法来完成我目前的目标,模仿了" Splat"操作员的工作. 我做了一种中心的方法,其余的方法可以打电话给我,因为我意识到我有几个非常相似的方法,除了一些小事情外,他们都在做同样的事情.这是方法签名: private String callScript(String scriptLocation, String... extraArgs) throws Exception { 我想至少需要一个参数(scriptLocation),然后允许多个额外的参数.我最终要做的是创建ProcessBuilder.我的愿望是做这样的事情: ProcessBuilder pb = new ProcessBuilder("something", scriptLocation, /* extraArgs */); 但是,当然,ProcessBuilder
2 2023-11-13
编程技术问答社区
Haskell是否像Python和Ruby一样有一个splat运算符?
在Python和Ruby中(我敢肯定).您可以使用*(" splat")将其用作参数列表的枚举前缀.例如,在Python中: >>> def foo(a,b): return a + b >>> foo(1,2) 3 >>> tup = (1,2) >>> foo(*tup) 3 哈斯克尔有类似的东西吗?我认为由于其任意长度,它在列表上行不通,但我觉得与该元组有关,它应该起作用.这是我想要的例子: ghci> let f a b = a + b ghci> :t f f :: Num a => a -> a -> a ghci> f 1 2 3 ghci> let tuple = (1,2) 我正在寻找允许我做的操作员(或功能): ghci> f `op` tuple 3 我看过()被称为" splat",但似乎并没有指其他语言中的splat.我还是尝试了: ghci> import Control.Applicative ghci> f
16 2023-10-27
编程技术问答社区
为什么拼接会在rhs上创建一个元组,而在lhs上创建一个列表?
考虑,例如, 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迭代器.您将其解放到中是由您使用元组语法的事实决定的: *whatever, 而不是列表语法: [*whatever] 或设置语法: {*whatever} 您可能已经获得了列表或集合.您只是告诉Python做一个元组. 在LHS上,一个激烈的分配目标总是会产生列表.是否使用"元组风格" 都没关系 *target, = whate
44 2023-10-27
编程技术问答社区
两级溅射TCL
如果我在TCL中有一个过程或命令,则具有可变数量的参数,则可以使用列表的元素作为输入,例如: set a [list "ko" ] set m [ list "ok" "bang" ] lappend a {*}$m 但是,如果我想"两次飞溅"怎么办?即,扁平2级?顺序使用两次,不起作用: set a [list "ko" ] set m [ list [ list "ok" ] [ list "bang" ] ] lappend a {*}{*}$m 会在额外的字符上出错. 解决方案 您已经注意到{*}(故意)不会深两个步骤. 您的特定示例不是很大的问题,所以我建议这样做: set a [list "ko" ] set m [list [list "a b" "c d"] [list "e f" "g h"]] lappend a {*}$m 在这里,我们得到a设置为ko {{a b} {c d}} {{e f} {g h}}.这不是你想要的
6 2023-10-14
编程技术问答社区
双拼运算符破坏性地修改了哈希值--这是一个Ruby bug吗?
我注意到**(double-Splat)操作员在Ruby 2.1.1中发现了一种非常令人惊讶的行为. 在**hash之前使用键值对时,哈希仍然没有修改;但是,当仅在**hash之后使用键值对时,哈希被永久修改. h = { b: 2 } { a: 1, **h } # => { a: 1, b: 2 } h # => { b: 2 } { a: 1, **h, c: 3 } # => { a: 1, b: 2, c: 3 } h # => { b: 2 } { **h, c: 3 } # => { b: 2, c: 3 } h # => { b: 2, c: 3 } 为了进行比较,请在数组上考虑单*操作员的行为: a = [2] [1, *a] # => [1, 2] a # => [2]
4 2023-10-13
编程技术问答社区
在哪里使用ruby splat操作符是合法的?
碎片很酷.尽管这很有趣,但它们不仅是为了爆炸阵列.他们还可以铸造到阵列和扁平阵列(请参阅 http://github.com/github.com/mischa/splat/树/主人详尽地列出了他们的工作.) 看起来一个人无法在SPLAT上执行其他操作,但是在1.8.6/1.9中,以下代码抛出了"意外的TSTAR": foo = bar || *zap #=> unexpected tSTAR 这有效: foo = *zap || bar #=> works, but of limited value splat可以在表达式中出现在哪里? 解决方案 首先,这里的优先级不是问题,因为foo = bar || (*zap)效果更好.一般的经验法则是,您无法对SPLAT执行其他操作.即使是像foo = (*zap)这样简单的东西也是无效的.这也适用于1.9. 话虽如此,您期望foo = bar || *zap有效,这与foo = bar || zap
1340 2023-10-13
编程技术问答社区
ruby:数字加法并在总和为 21 时打印 true
这是Rubeque.com上给出的一个简单的问题:编写一种方法,该方法采用任何数量的整数,如果总和为21.它通过以下方式测试输入: assert_equal twenty_one?(3, 4, 5, 6, 3), true assert_equal twenty_one?(3, 11, 10), false 这是我到目前为止所拥有的: def twenty_one?(*nums) nums.inject(&:+) end if twenty_one? == 21 puts true else false end 但是我收到错误消息: RuntimeError: The value '21' does not equal 'true'. 我对如何解决这个问题感到非常困惑.是否可以将IF/else语句放入该方法中?抱歉,如果这个问题确实是基本的.我是编程的新手. 解决方案 您需要以 为单 def twenty_one?(*n
2 2023-10-05
编程技术问答社区
Ruby: 如何杀死 "warning: `*' interpreted as argument prefix"?
如何从以下代码中删除"警告:'*'解释为参数前缀"? hash = {"a" => 1, "b" => 2, "s" => 3,} if "string".start_with? *hash.keys then puts "ok" else puts "ng" end 当我运行上面的代码时,我会得到: $ ruby -w /tmp/a.rb /tmp/a.rb:5: warning: `*' interpreted as argument prefix ok 解决此警告的最佳方法是什么? 我试图将括号围绕在hash上: hash = {"a" => 1, "b" => 2, "s" => 3,} if "string".start_with? (*hash.keys) then puts "ok" else puts "ng" end 然后您得到: $ ruby
6 2023-09-20
编程技术问答社区
如何将数组作为参数列表传递
Ruby's start_with?([prefixes]+) → true or false 看起来像我的数组,但事实并非如此.您可以将单个字符串或各种字符串作为参数,例如: "hello".start_with?("heaven", "hell") #=> true 如何通过数组作为参数列表?以下是不起作用的: "hello".start_with?(["heaven", "hell"]) 解决方案 支架是可选的文档约定,因此 中的支架 start_with?([prefixes]+) → true or false 只是说您可以用零或更多prefixes呼叫start_with?.这是文档中的一个常规惯例,您会看到它的 jquery documentation, backbone documentation, mdn javascript 文档,几乎所有其他软件文档. 如果您有要与start_with?一起使用的一系列前缀,则
8 2023-08-22
编程技术问答社区
为什么这里在数组定义中使用了 splat?
def initialize(apps, catch=404) @apps = []; @has_app = {} apps.each { |app| add app } @catch = {} [*catch].each { |status| @catch[status] = true } end 在此方法中,在我认为在方法参数中使用了SPLAT来指示您何时要有一个未指定的参数. Splat在这里有不同的含义吗? 解决方案 它为捕获 我不确定有人完全了解SPLAT操作员.很多时候它删除了一个"数组"的一个级别,但不会删除最后一个级别. 至少在这种情况下可以得到它.无论catch是单个数字还是数字数组,它都会为捕获参数创建一个单个数组. >> t = [*404] => [404] >> t = [*[404,405,406]] => [404, 405, 406] 其他解决方案 我认为理解这一点的最佳方法是查看irb中发生的事情.
4 2023-08-22
编程技术问答社区
这在 Ruby 语言中是什么意思?
运行以下代码, a = [1, 2, 3, 4, 5] head, *tail = a p head p tail 您将获得结果 1 [2, 3, 4, 5] 谁可以帮助我解释说明head,*tail = a,谢谢! 解决方案 head, *tail = a是指将数组的第一个元素a分配给head,然后将其余元素分配给tail. . *,有时称为" Splat Operator",用数组做许多事情.当它在分配运算符(=)的左侧时,如您的示例时,它只是意味着"将所有东西都放在. 如果您省略了该代码中的splat,则可以这样做: head, tail = [1, 2, 3, 4, 5] p head # => 1 p tail # => 2 但是,当您将SPLAT添加到tail中时,它的意思是"所有未分配给先前变量(head)的所有内容,分配给tail." 其他解决方案 首先,这是一个并行分配.在红宝石中,您可以写 a,b = 1,
14 2023-08-22
编程技术问答社区
了解范围和数组中的 ruby splat
我试图了解*(1..9)和[*1..9] 之间的区别 如果我将它们分配给变量,它们以相同的方式工作 splat1 = *(1..9) # splat1 = [1, 2, 3, 4, 5, 6, 7, 8, 9] splat2 = [*1..9] # splat2 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 但是,当我尝试直接使用*(1..9)和[*1..9]时,事情变得很奇怪. *(1..9).map{|a| a.to_s} # syntax error, unexpected '\n', expecting tCOLON2 or '[' or '.' [*1..9].map{|a| a.to_s} # ["1", "2", "3"...] 我猜想问题的一部分是操作员的定位吗?但是我不确定发生了什么.为什么我无法使用*(1..9)我可以使用[*1..9]? 解决方案 我相信问题是Splat只能用作LVALUE,即必须被某物接收.
2 2023-08-22
编程技术问答社区
在 Ruby 中,独立的 splat 运算符 (*) 是用来做什么的?
我刚刚遇到了这个示例,在该示例中,splat操作员在方法定义中自身使用了: def print_pair(a,b,*) puts "#{a} and #{b}" end print_pair(1,2,3,:cake,7) #=> 1 and 2 很明显,您在这样的上下文中使用它: def arguments_and_opts(*args, opts) puts "arguments: #{args} options: #{opts}" end arguments_and_opts(1,2,3, a: 5) #=> arguments: [1, 2, 3] options: {:a=>5} 但是为什么以及如何在第一个示例中使用它?由于它是在红宝石规格中定义的,因此必须有一个用户酶? 解决方案 在参数列表中,*args表示"吞噬数组中的所有剩余参数,并将它们绑定到名为args的参数". *意思 这正是您使用此方法的时间:当您想忽略所有剩余参数时.要么
18 2023-08-22
编程技术问答社区
在 Ruby 中,*(星号)是什么意思?
可能的重复: *操作员在Ruby 可能在其他地方有答案,但我只是不知道如何找到它... 如果我是对的,则*表示多个参数,如果在函数定义中使用: def hero(name, *super_powers) 但是*在这样的代码中有什么作用: Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten] # => {:first_name=>"Shane", :last_name=>"Harvie"} 解决方案 可变长度参数列表,星号运算符 方法的最后一个参数可以先于星号(*),该参数有时称为" splat"操作员.这表明可以将更多参数传递给该函数.收集这些参数并创建一个数组. 星号运算符也可以在方法调用中的数组参数之前.在这种情况下
14 2023-08-22
编程技术问答社区
双 * (splat) 运算符有什么作用
您是否看到过这样声明的函数? def foo a, **b ... end 我知道单个*是SPLAT运算符. **是什么意思? 解决方案 Ruby 2.0引入了关键字参数,**的作用为*,但对于关键字参数.它返回带有键/值对的哈希. 对于此代码: def foo(a, *b, **c) [a, b, c] end 这是一个演示: > foo 10 => [10, [], {}] > foo 10, 20, 30 => [10, [20, 30], {}] > foo 10, 20, 30, d: 40, e: 50 => [10, [20, 30], {:d=>40, :e=>50}] > foo 10, d: 40, e: 50 => [10, [], {:d=>40, :e=>50}] 其他解决方案 是 double splat 运算符,自Ruby 2.0以来可用. 它捕获了所有关键字参数(这也可以是一个简单的哈希,这是模仿
34 2023-08-22
编程技术问答社区
*(星号)符号在函数参数附近有什么作用,如何在其他情况下使用?
我在Rails 3上使用Ruby,我想知道什么意思是在函数参数附近的*操作员的存在,并在其他情况下了解其用法. 示例场景(此方法来自Ruby on Rails 3框架): def find(*args) return to_a.find { |*block_args| yield(*block_args) } if block_given? options = args.extract_options! if options.present? apply_finder_options(options).find(*args) else case args.first when :first, :last, :all send(args.first) else find_with_ids(*args) end end end 解决方案 这是SPLAT操作员,它来自Ruby(因此不是轨道
16 2023-08-14
编程技术问答社区
如何使用Ruby 2.3中引入的Array#dig和Hash#dig?
Ruby 2.3在Array和Hash上引入了一种新方法,称为dig.我在博客文章中看到的有关新版本的示例是人为的和令人费解的: # Hash#dig user = { user: { address: { street1: '123 Main street' } } } user.dig(:user, :address, :street1) # => '123 Main street' # Array#dig results = [[[1, 2, 3]]] results.dig(0, 0, 0) # => 1 我不使用三个嵌套的平面阵列.什么是有用的现实例子? 更新 事实证明,这些方法解决了最常见的红宝石问题之一.以下问题具有大约20个重复项,所有这些都通过dig来解决. 嵌套哈希缺少元素,没有重复的无检查? ruby​​ Style ">存在嵌套的哈希元素 解决方案 在我们的情况下,由于nil引用引起
26 2023-08-14
编程技术问答社区
在这段Ruby代码中,(单数)*运算符有什么作用?
给定红宝石代码 line = "first_name=mickey;last_name=mouse;country=usa" record = Hash[*line.split(/=|;/)] 我了解第二行中的所有内容,与*操作员不同 - 它在做什么,文档在哪里? (您可能会猜到,寻找这种情况很难...) 解决方案 *是 splat 运算符. 它将Array扩展到参数列表中,在这种情况下,Hash.[]方法的参数列表. (更确切地说,它扩展了响应to_ary/to_a或to_a的任何对象.) ) 要说明,以下两个语句相等: method arg1, arg2, arg3 method *[arg1, arg2, arg3] 它也可以在不同的上下文中使用,以在方法定义中捕获所有其余的方法参数.在这种情况下,它不会扩展,而是结合: def method2(*args) # args will hold Array of all argum
18 2023-08-14
编程技术问答社区
本地或远程执行带有通用参数的powershell脚本
在开发团队中,我希望拥有相同的测试脚本由开发器或我们的测试平台远程执行. 这是我想用作每个脚本的前提 # Test local/remote execution by reading C:\ directory param( [switch] $verbose, [switch] $remote, [string] $ip, [string] $user, [string] $password #Add here script specific parameters ) Write-Host "Command invokation incoming parameter count : " $psboundparameters.count if ($remote) { $Params = @{} $RemoteParams = @{} $pass = ConvertTo-SecureString -St
6 2023-08-07
编程技术问答社区
改变*splat和**splatty-splat操作符对我的对象的操作
您如何覆盖解开语法*obj和**obj? 的结果 例如,您可以以某种方式创建一个对象thing: >>> [*thing] ['a', 'b', 'c'] >>> [x for x in thing] ['d', 'e', 'f'] >>> {**thing} {'hello world': 'I am a potato!!'} 注意: __iter__的迭代(" for x in thick in thing in thing")返回 *splat uncack的不同元素. 我看了operator.mul和operator.pow,但是这些功能仅涉及两个操作数,例如a*b和a**b,并且似乎与Splat操作无关. 解决方案 *迭代在一个对象上,并将其元素用作参数. **迭代在对象的keys上,并使用__getitem__(等效于括号符号)来获取键值对.要自定义*,只需使您的对象具有峰值,然后自定义**,使您的对象为映射: class MyIterabl
6 2023-07-17
编程技术问答社区