在具有 yield 语句的 def 中使用 print
using print inside def having yield statement
我正在尝试在函数内部打印。
该函数用于调用块。
但是我没有看到函数定义中发生打印。
请阐明这一点。基本上我对控制流程不是很清楚
def find_all
matching_items = []
self.each do |item|
if yield(item)
puts "after yield" #print not happening
matching_items << item
end
end
matching_items
end
p ['a', 'b','c','c'].find_all { |item|
if item == 'a'
true
end
}
如果您的代码与编写的完全一致,则您正在定义 main
上定义的独立方法 find_all
。当您键入 [1,2,3,4].find_all
时,您正在调用 Array
上的 find_all
方法,该方法在 Enumerable 方法中定义。所以你根本没有调用你的方法。
您可能想做的是
class Array
def find_all
...
end
end
这样,[1,2,3,4].find_all会调用这个方法。
但是,请注意,这可能不是一个好主意:您正在重写 class 中不属于您的核心方法,因此这可能会对您无法处理的其他代码产生影响预测是否有任何其他代码使用 find_all 方法。
您可能会尝试定义一个将数组作为参数的方法。您可以将其移动到模块中,但现在:
def find_all(array)
matching_items = []
array.each do |item|
if yield(item)
puts "after yield" #print not happening
matching_items << item
end
end
matching_items
end
当然,这基本上是 Enumerable#find_all
已经在做的,但效率较低:所以也许这只是一个学术练习,在这种情况下,太棒了!但否则,为什么不直接使用现有的方法?
如果您正在尝试 re-open
class Array
那么,您可以这样做
class Array
def find_all(matching_items = [])
self.each do |item|
if yield(item)
puts "after yield" #print not happening
matching_items << item
end
end
matching_items
end
end
p ['a', 'b', 'c', 'c'].find_all { |item|
if item == 'a'
true
end
}
输出
after yield
["a"]
我正在尝试在函数内部打印。 该函数用于调用块。 但是我没有看到函数定义中发生打印。 请阐明这一点。基本上我对控制流程不是很清楚
def find_all
matching_items = []
self.each do |item|
if yield(item)
puts "after yield" #print not happening
matching_items << item
end
end
matching_items
end
p ['a', 'b','c','c'].find_all { |item|
if item == 'a'
true
end
}
如果您的代码与编写的完全一致,则您正在定义 main
上定义的独立方法 find_all
。当您键入 [1,2,3,4].find_all
时,您正在调用 Array
上的 find_all
方法,该方法在 Enumerable 方法中定义。所以你根本没有调用你的方法。
您可能想做的是
class Array
def find_all
...
end
end
这样,[1,2,3,4].find_all会调用这个方法。
但是,请注意,这可能不是一个好主意:您正在重写 class 中不属于您的核心方法,因此这可能会对您无法处理的其他代码产生影响预测是否有任何其他代码使用 find_all 方法。
您可能会尝试定义一个将数组作为参数的方法。您可以将其移动到模块中,但现在:
def find_all(array)
matching_items = []
array.each do |item|
if yield(item)
puts "after yield" #print not happening
matching_items << item
end
end
matching_items
end
当然,这基本上是 Enumerable#find_all
已经在做的,但效率较低:所以也许这只是一个学术练习,在这种情况下,太棒了!但否则,为什么不直接使用现有的方法?
如果您正在尝试 re-open
class Array
那么,您可以这样做
class Array
def find_all(matching_items = [])
self.each do |item|
if yield(item)
puts "after yield" #print not happening
matching_items << item
end
end
matching_items
end
end
p ['a', 'b', 'c', 'c'].find_all { |item|
if item == 'a'
true
end
}
输出
after yield
["a"]