标签: ruby-block

Ruby:使用条件的返回值进行变量赋值和比较

我有一个方法,为了检查它是否被传递一个块,我执行以下操作:

if block_given?
    res = yield(array[i], array[i+1])
  else
    res = array[i] - array[i+1]
  end
Run Code Online (Sandbox Code Playgroud)

然而,RuboCop正在给我一个警告,我不明白这一点if block_given?:

使用条件的返回值进行变量赋值和比较

还有其他更多的rubyist方式吗?

谢谢

ruby ruby-block

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

Ruby - 检查block_given之间有什么区别?和!block.nil?

我有一个ruby方法需要检查块是否传递给它.一位同事建议只检查block.nil?性能是否稍微快一点,并且适用于命名块.这已经非常烦人,因为他正在使用命名块并使用它来调用它block.call而不是yield显示更快,因为命名块在可读性方面更容易理解.

版本1:

def named_block &block
   if block.nil?
     puts "No block"
   else
     block.call
   end
end
Run Code Online (Sandbox Code Playgroud)

版本2:

def named_block &block
  if !block_given?
    puts "No block"
  else 
    block.call
  end
end
Run Code Online (Sandbox Code Playgroud)

基准测试显示版本1比版本2略快,但是快速查看源代码似乎表明它block_given?是线程安全的.

这两种方法有哪些主要区别?请帮我证明他错了!

ruby performance ruby-block

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

如何将方法调用链接到Ruby中的`do ... end`块?

我正在做以下事情:

array_variable = collection.map do |param|
  some value with param
end
return array_variable.compact
Run Code Online (Sandbox Code Playgroud)

我可以打电话map,并compact在某种程度上一条语句,这样我就可以立即返回结果?

我正在考虑这样的事情(但可能无效):

array_variable = block_code param.compact 
# block_code here is a method for example which fills the array
Run Code Online (Sandbox Code Playgroud)

ruby ruby-block

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

如何使用 rspec 检查块被调用

我想检查是否使用 rspec 在我的函数中调用了该块。下面是我的代码:

class SP
  def speak(options={},&block)
    puts "speak called" 
    block.call()
    rescue ZeroDivisionError => e
  end  
end




describe SP do
 it "testing speak functionality can receive a block" do
    sp = SP.new
    def test_func 
        a = 1
    end
    sp_mock = double(sp)
    expect(sp_mock).to receive(:speak).with(test_func)
    sp.speak(test_func)
 end  
end 
Run Code Online (Sandbox Code Playgroud)

以下是我的错误:

SP testing speak functionality can receive a block
     Failure/Error: block.call()

     NoMethodError:
       undefined method `call' for nil:NilClass
     # ./test.rb:9:in `speak'
     # ./test.rb:25:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

能否请你帮忙。我在这方面花了很多时间。

ruby rspec ruby-block

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

将块传递给映射函数

我想知道这样的事情是否可能?

info = arrange_info({|x| [x.name, x.number]}, info_array)

def arrange_info(block, info)
    info.map(block).to_h
end
Run Code Online (Sandbox Code Playgroud)

这将允许我通过不同的块以不同的方式排列数组,我现在如何让它不起作用,但是这样的事情可能吗?

ruby map-function ruby-block

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

`block_given?` 是否使 `&amp;block` 参数可选?

我对以下几点感到满意:

def some_def(foo, &block)
    puts "block utilized below"
    block.call(foo)
end

def some_other_def(bar)
    puts "using yield below"
    yield bar
    puts "and back into the method"
end
Run Code Online (Sandbox Code Playgroud)

所以我学会了将块(和过程)与yield关键字分开。

但是,我遇到了以下代码:

# ./open_file.rb

class File
    def self.open(name, mode, &block)
        file = new(name, mode)
        return file unless block_given?
        yield(file)
    ensure
        file.close
    end
end
Run Code Online (Sandbox Code Playgroud)

&block当我在 irb 中执行此代码时,参数似乎并不重要:

irb -r ./file.open.rb
Run Code Online (Sandbox Code Playgroud)

并做类似的事情:

File.open('foo.txt','r') {|f| puts f}
Run Code Online (Sandbox Code Playgroud)

通过 in呈现&block为可选block_given?

return file unless block_given?
Run Code Online (Sandbox Code Playgroud)

ruby yield ruby-block

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

给出"Array.new(10){| e | e = e*2}"的Array#new工作的块形式如何?

我无法理解花括号内的部分.

Array.new(10) { |e| e = e * 2 }
# => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]   
Run Code Online (Sandbox Code Playgroud)

我知道创建了一个包含十个值的新数组,但下半部分是做什么的?

ruby arrays constructor ruby-block

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