小编Tel*_*hus的帖子

如何在Ruby中将数组添加到另一个数组而不是最终得到多维结果?

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)

ruby arrays multidimensional-array

450
推荐指数
16
解决办法
35万
查看次数

在Bash完成的上下文中关于$ {array [*]}与$ {array [@]}的混淆

我正在尝试第一次编写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[@]}扩展到了什么.

arrays bash bash-completion

73
推荐指数
2
解决办法
3万
查看次数

如何以有效的方式获取文件中的行数?

我有一个大文件.它包括大约3.000-20.000行.如何使用Java获取文件中的行总数?

java file

67
推荐指数
7
解决办法
22万
查看次数

在Perl中,有什么理由更喜欢glob而不是readdir(反之亦然)?

这个问题是从这个问题中分拆出来的.一些历史:当我第一次学习Perl时,我总是使用glob而不是opendir+ readdir因为我发现它更容易.后来各种帖子和读物表明这glob很糟糕,所以现在我几乎总是使用readdir.

在思考了这个最近的问题之后,我意识到我选择其中一个或另一个选择的理由可能是无聊的.所以,我将列出一些优点和缺点,我希望更有经验的Perl人可以插入并澄清.概括地说,问题是有没有令人信服的理由,更喜欢globreaddirreaddirglob(在某些或所有情况下)?

glob 优点:

  1. 没有dotfiles(除非你要求他们)
  2. 物品的订单是有保证的
  3. 无需手动将目录名称添加到项目上
  4. 更好的名字(来吧- globreaddir没有比赛,如果我们的名字单独判断)
  5. (从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 缺点:

  1. 旧版本只是简单的破坏(但是"较旧"意味着5.6之前的版本,我认为,坦率地说,如果你使用的是5.6之前的版本,你会遇到更大的问题)
  2. stat每次调用(即stat在大多数情况下无用).
  3. 目录名称中的空格问题(这仍然是真的吗?)
  4. (来自brian的回答)可以返回不存在的文件名:

    $ perl -le 'print glob "{ab}{cd}"'
    
    Run Code Online (Sandbox Code Playgroud)

readdir 优点:

  1. (来自brian的回答)opendir返回一个文件句柄,你可以在你的程序中传递(并重用),但glob只返回一个列表
  2. (布莱恩的回答)readdir是正确的迭代器,并提供功能rewinddir,seekdir,telldir
  3. 快点?(根据上面的一些glob特征进行纯粹的猜测.无论如何,我并不是真的担心这种优化水平,但它是理论专家.)
  4. 不太容易出现边缘情况的错误glob
  5. 默认情况下读取所有内容(dotfiles)(这也是一个骗局)
  6. 可能会说服你不要命名文件0 …

perl glob readdir

62
推荐指数
4
解决办法
1万
查看次数

如何替换ruby中的每个模式实例?

string.sub看起来它只替换了第一个实例.是否有可以替换所有模式的方法或其他方法?你能在像perl这样的正则表达式中做到吗?

(我觉得像r/blah/blah /)

...和任何能告诉我为什么在地球上确实string.sub取代第一场比赛的人?

ruby regex string replace

30
推荐指数
2
解决办法
3万
查看次数

Ruby中使用的保留字BEGIN或END是什么?

这是一个很难找到的词,因为在大多数情况下,它们在搜索过程中不敏感.我在文档之外找到的最好的是IRB中的测试.

 BEGIN{puts x = 10}
 10
Run Code Online (Sandbox Code Playgroud)

ruby reserved-words

22
推荐指数
4
解决办法
4415
查看次数

ruby如何处理数组范围访问?

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项数组的范围,为什么它们会返回不同的值?

ruby arrays range

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

如何在Ruby正则表达式中插入变量?

 data.to_enum(:scan,/(#entity[0])/i).map do |m,|
        p $`.size
Run Code Online (Sandbox Code Playgroud)

如何在正则表达式中使用动态变量? #entity[0]返回一个值,但在上面的语法中,#entity [0]字面意思在正则表达式中.

ruby regex

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

关于Ruby 1.9.x的测试框架是否有共识?

一个快速介绍的两人组合.简介:我是从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 testing rspec minitest

11
推荐指数
2
解决办法
2039
查看次数

如何选择在Ruby中动态包含哪个版本的模块?

我正在编写一个小型Ruby命令行应用程序,它使用fileutils标准库进行文件操作.根据用户调用应用程序的方式,我想要包括FileUtils,FileUtils::DryRun或者FileUtils::Verbose.

既然include是私有的,我不能把逻辑选择到对象的initialize方法中.(这是我的第一个想法,从那时起我就可以将有关用户选择的信息作为参数传递给new.)我已经提出了两个似乎有用的选项,但我对以下两种方法都不满意:

  1. 根据用户的选择在应用程序命名空间中设置一个全局变量,然后在类中执行条件包含:

    class Worker
      case App::OPTION
      when "dry-run"
        include FileUtils::DryRun
        etc.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建子类,唯一的区别是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,但我希望有一些我没有想过的更直接的方法.

ruby module include

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