English.rb has a list of all the standard global variables.
usually defined like this:
class Example attr_reader :iv def initialize @iv = 123 end end ex = Example.new ex.iv # 123
but don't use it. better to have @x scoped to the Class object like this:
class Example @civ = 123 class << self attr_reader :civ end end Example.civ # 123
class Example def self.count @count ||= 0 end def self.count=(n) @count = n end def initialize self.class.count += 1 end end x = Example.new y = Example.new puts Example.count # 2
The reason for this is that @@var belongs to the class hierarchy, not to the class:
class Parent @@var = 1 end class Child < Parent @@var = 2 end class Parent puts @@var # shows 2, since these @@var's are not distinct end
There is a separate local scope for:
For example, the top, class, and module variables are not available inside methods.
Blocks have access to their container's scope but also start their own scope. Local variables first used inside a block are scoped to the block.
To ensure that a block variable is not used in its container, it can be defined as block-local (1.9+).
x = 99 4.times.do |i ; x| # x is block-local so it is not the same as the x in x = 99 end
Block parameters are scoped to the block. If a block parameter has the same name as a variable in the container's scope, they are distinct so the variable from the container can't be seen inside the block.
x = 98 i = 99 4.times.do |i ; x| # x is block-local so it is not the same as the x in x = 98 # i is a block parameter so it is not the same as the i in i = 99 end
Because a block has its container's scope in addition to its own, defining a Proc with a block includes the container's scope at the time of definition of the Proc in its block, that is, a Proc acts a closure.