somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)
Run Code Online (Sandbox Code Playgroud)
我期望
["some","thing","another","thing"]
Run Code Online (Sandbox Code Playgroud) 我正在尝试第一次编写Bash完成,我对解除引用Bash数组(${array[@]}
和${array[*]}
)的两种方法感到困惑.
这是相关的代码块(顺便说一句,它可以工作,但我想更好地理解它):
_switch()
{
local cur perls
local ROOT=${PERLBREW_ROOT:-$HOME/perl5/perlbrew}
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
perls=($ROOT/perls/perl-*)
# remove all but the final part of the name
perls=(${perls[*]##*/})
COMPREPLY=( $( compgen -W "${perls[*]} /usr/bin/perl" -- ${cur} ) )
}
Run Code Online (Sandbox Code Playgroud)
Bash的文档说:
可以使用$ {name [subscript]}引用数组的任何元素.需要大括号以避免与shell的文件名扩展运算符冲突.如果下标是'@'或'*',则该单词将扩展为数组名称的所有成员.这些下标仅在单词出现在双引号内时有所不同.如果单词是双引号,则$ {name [*]}扩展为单个单词,每个数组成员的值由IFS变量的第一个字符分隔,$ {name [@]}扩展名称的每个元素一个单独的词.
现在我想我明白,compgen -W
期望一个字符串包含可能的替代词列表,但在这种情况下,我不明白"$ {name [@]}将名称的每个元素扩展为单独的词"是指.
长话短说:${array[*]}
作品; ${array[@]}
没有.我想知道为什么,我想更好地理解究竟是什么${array[@]}
扩展到了什么.
这个问题是从这个问题中分拆出来的.一些历史:当我第一次学习Perl时,我总是使用glob
而不是opendir
+ readdir
因为我发现它更容易.后来各种帖子和读物表明这glob
很糟糕,所以现在我几乎总是使用readdir
.
在思考了这个最近的问题之后,我意识到我选择其中一个或另一个选择的理由可能是无聊的.所以,我将列出一些优点和缺点,我希望更有经验的Perl人可以插入并澄清.概括地说,问题是有没有令人信服的理由,更喜欢glob
到readdir
或readdir
到glob
(在某些或所有情况下)?
glob
优点:glob
与readdir
没有比赛,如果我们的名字单独判断)(从ysth的回答;参见glob
下面的参考资料4)可以返回不存在的文件名:
@deck = glob "{A,K,Q,J,10,9,8,7,6,5,4,3,2}{\x{2660},\x{2665},\x{2666},\x{2663}}";
Run Code Online (Sandbox Code Playgroud)glob
缺点:stat
每次调用(即stat
在大多数情况下无用).(来自brian的回答)可以返回不存在的文件名:
$ perl -le 'print glob "{ab}{cd}"'
Run Code Online (Sandbox Code Playgroud)readdir
优点:opendir
返回一个文件句柄,你可以在你的程序中传递(并重用),但glob
只返回一个列表readdir
是正确的迭代器,并提供功能rewinddir
,seekdir
,telldir
glob
特征进行纯粹的猜测.无论如何,我并不是真的担心这种优化水平,但它是理论专家.)glob
?0 …
string.sub
看起来它只替换了第一个实例.是否有可以替换所有模式的方法或其他方法?你能在像perl这样的正则表达式中做到吗?
(我觉得像r/blah/blah /)
...和任何能告诉我为什么在地球上确实string.sub
取代第一场比赛的人?
这是一个很难找到的词,因为在大多数情况下,它们在搜索过程中不敏感.我在文档之外找到的最好的是IRB中的测试.
BEGIN{puts x = 10}
10
Run Code Online (Sandbox Code Playgroud) ruby-1.8.7-p174 > [0,1][2..3]
=> []
ruby-1.8.7-p174 > [0,1][3..4]
=> nil
Run Code Online (Sandbox Code Playgroud)
在0索引设置中,索引2,3和4实际上都超出了2项数组的范围,为什么它们会返回不同的值?
data.to_enum(:scan,/(#entity[0])/i).map do |m,|
p $`.size
Run Code Online (Sandbox Code Playgroud)
如何在正则表达式中使用动态变量?
#entity[0]
返回一个值,但在上面的语法中,#entity [0]字面意思在正则表达式中.
一个快速介绍的两人组合.简介:我是从Perl来到Ruby的,我在测试框架选择中有点迷失.我知道可能没有单一的,全方位的最佳选择,但我甚至无法清楚地了解比赛场地.
那么,首先,MiniTest还是Test :: Unit?我刚刚意识到1.9.1默认为MiniTest.我没有注意到,因为所有较旧的Test :: Unit教程仍然可以正常工作.如果您require test/unit
,您实际上将MiniTest作为Test :: Unit模拟器(!).我最初的想法是使用MiniTest的默认选择(一旦我知道它就在那里),但即使是最新的书也似乎没有兴趣教它.Ruby Best Practices说"两者之间存在显着差异",但他选择不处理它们.他还通过Test :: Unit(以及一些自定义附加组件)运行他的所有测试.新的Pickaxe 本身也很少涉及MiniTest ,在测试章节中他们也使用了MiniTest的Test :: Unit仿真版本.为了澄清我的第一个问题:MiniTest是一个糟糕的第一选择吗?我应该默认使用Test :: Unit模拟器吗?
其次,除了内置选项之外,还有用于行为驱动测试的Rspec,Cucumber和公司.社区是否倾向于这种风格和这个框架?我应该从Rspec开始吗?
我会对这三个人玩一点,但我很想知道在Ruby 1.9中围绕测试形成了什么样的共识(如果有的话).
(快速跟进,提醒自己和任何感兴趣的人.请参阅此链接,了解各种Rubies 1.8到1.9.1中Test :: Unit和MiniTest的不同调用的有用概述.)
我正在编写一个小型Ruby命令行应用程序,它使用fileutils
标准库进行文件操作.根据用户调用应用程序的方式,我想要包括FileUtils
,FileUtils::DryRun
或者FileUtils::Verbose
.
既然include
是私有的,我不能把逻辑选择到对象的initialize
方法中.(这是我的第一个想法,从那时起我就可以将有关用户选择的信息作为参数传递给new
.)我已经提出了两个似乎有用的选项,但我对以下两种方法都不满意:
根据用户的选择在应用程序命名空间中设置一个全局变量,然后在类中执行条件包含:
class Worker
case App::OPTION
when "dry-run"
include FileUtils::DryRun
etc.
Run Code Online (Sandbox Code Playgroud)创建子类,唯一的区别是FileUtils
它们包含哪个版本.根据用户的选择选择合适的一个.
class Worker
include FileUtils
# shared Worker methods go here
end
class Worker::DryRun < Worker
include FileUtils::DryRun
end
class Worker::Verbose < Worker
include FileUtils::Verbose
end
Run Code Online (Sandbox Code Playgroud)第一种方法似乎是DRY-er,但我希望有一些我没有想过的更直接的方法.