小编Mai*_*kon的帖子

前面的冒号:YAML语法

我目前正在项目中使用Sidekiq,我有以下YAML配置文件:

:concurrency: 5
:pidfile: /tmp/pids/sidekiq.pid
:logfile: log/sidekiq.log
staging:
  :concurrency: 10
production:
  :concurrency: 20
queues:
  - default
Run Code Online (Sandbox Code Playgroud)

我之前没有看到在一把钥匙前面有一个冒号,但省略了冒号会产生有趣的结果.:pidfile:例如,在前面有冒号的情况下,它会创建/覆盖没有它的目标文件,它使用已存在的目标文件并且不写入它.

这是在某处记录的,还是Sidekiq对某些键的期望?

ruby yaml ruby-on-rails sidekiq

15
推荐指数
2
解决办法
2165
查看次数

在Ruby中测试STDIN

我目前正在尝试测试一个基本方法,它接收来自用户的一些输入(获取)并输出它(puts).经过一番研究后,我找到了测试标准输出流的好方法,如下所示:

def capture_standard_output(&block)
  original_stream = $stdout
  $stdout = mock = StringIO.new
  yield
  mock.string.chomp
ensure
  $stdout = original_stream
end
Run Code Online (Sandbox Code Playgroud)

我正在测试的方法是下面的那个,输出和输入是指我在开头初始化并指向等效的$ stdout&$ stdin的ivars:

def ask_for_mark
  ouput.puts 'What shall I call you today?'
  answer = input.gets.chomp.capitalize
  answer
end
Run Code Online (Sandbox Code Playgroud)

现在我已经看到了STDIN的一些解决方案,但还没有真正了解它们中的任何一个,我绝对不想复制和粘贴.我唯一能够"工作"的是下面的那个,但它并没有真正起作用,因为当我运行rspec它暂停并等待输入时,只需按Enter键,它就会通过:

  it "takes user's name and returns it" do
    output = capture_standard_output { game.ask_for_name }
    expect(output).to eq "What shall I call you today?"
    game.input.stub(:gets) { 'joe' }
    expect(game.ask_for_name).to eq 'Joe'
  end
Run Code Online (Sandbox Code Playgroud)

什么是测试STDIN的好方法?我一直大部分时间一直盯着屏幕(不好,我知道)所以一个新的视角和一些帮助将非常感激:-)

更新

对于任何面临类似问题的人,我都遵循不同的(更简单的)方法.首先,我将在他们自己的方法中分离IO操作.

在输入的情况下,在测试中可以预先填充所需的数据,因此当gets发送消息时,它将返回由换行符分隔的数据,\n如下所示:

input = StringIO.new("one\ntwo\n")
=> #<StringIO:0x007f88152f3510>
input.gets …
Run Code Online (Sandbox Code Playgroud)

ruby testing stdin rspec

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

Ruby 中的 Array.first 与 Array.shift

我本质上正在经历一个练习,从 Enumerable 模块重写注入方法的基本形式,而我的解决方案没有做任何事情,因为我使用的是#first:

def injecting(*acc, &block)
  acc = acc.empty? ? self.first : acc.first
  self.each do |x|
     acc = block.call(acc, x)
  end  
  acc
end
Run Code Online (Sandbox Code Playgroud)

然后我遇到了另一个解决方案,它使用 #shift 而不是 #first 并且工作得很好:

def injecting(*acc, &block)
  acc = acc.empty? ? self.shift : acc.first
  self.each do |x|
    acc = block.call(acc, x)
  end  
  acc
end  
Run Code Online (Sandbox Code Playgroud)

我知道 #first 返回数组的第一个元素,但不会更改它,而 #shift 返回并更改它,但我很难理解如果要进行变异,下面的代码如何仍然获得所需的结果通过删除第一个元素来删除数组:

[1,2,3].injecting { |a,x| a + x } # --> 6
Run Code Online (Sandbox Code Playgroud)

任何智慧之言将不胜感激。

谢谢!

ruby arrays methods shift

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

奇怪的ruby逻辑&&运算符结果

我在Pry玩,遇到了这个:

20] pry(main)> ('X' && 'O') == 'X'
=> false
[22] pry(main)> ('O' && 'X') == 'X'
=> true
Run Code Online (Sandbox Code Playgroud)

有了这个,我试图检查括号内的两个值是否与右边的值相同.第二个结果告诉我,我错过了一些东西.

看起来它正在返回最后一次比较的值('X'=='X'),但我认为&&会在发现第一个错误后立即停止?

我可以看到为什么顺序一般很重要,但我想通过将它们包装在()中它们会被检查为一个条件?

ruby comparison logical-operators

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