我有一个方法,为了检查它是否被传递一个块,我执行以下操作:
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方法需要检查块是否传递给它.一位同事建议只检查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?是线程安全的.
这两种方法有哪些主要区别?请帮我证明他错了!
我正在做以下事情:
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) 我想检查是否使用 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)
能否请你帮忙。我在这方面花了很多时间。
我想知道这样的事情是否可能?
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)
这将允许我通过不同的块以不同的方式排列数组,我现在如何让它不起作用,但是这样的事情可能吗?
我对以下几点感到满意:
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) 我无法理解花括号内的部分.
Array.new(10) { |e| e = e * 2 }
# => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Run Code Online (Sandbox Code Playgroud)
我知道创建了一个包含十个值的新数组,但下半部分是做什么的?
ruby ×7
ruby-block ×7
arrays ×1
constructor ×1
map-function ×1
performance ×1
rspec ×1
yield ×1