This answer is mostly just for fun, I do not suggest you use it.
Ruby , , . , , - , : - !
, , backtrace () "block" .
class InspectBacktrace < Exception
end
def block
raise InspectBacktrace
rescue InspectBacktrace => e
level = e.backtrace.count { |x| x =~ /in `block'/ }
puts "from block #{level}"
yield
end
block do
puts "from command line"
block do
puts "from command line"
block do
puts "from command line"
end
end
end
:
from block 1
from command line
from block 2
from command line
from block 3
from command line
: Kernel#caller, . , , "block" , :
def block
level = caller.count { |x| x =~ /^#{ Regexp.escape(__FILE__) }:\d+:in `block'$/ } + 1
puts "from block #{level}"
yield
end