Functions scope


#1

class C
def open()
# how to call global open function from here?
end
end


#2

i think you can do

::open

;D

On 29/03/06, Mirek removed_email_address@domain.invalid wrote:


Daniel B.
http://danielbaird.com (TiddlyW;nks! :: Whiteboard Koala :: Blog ::
Things
That Suck)
[[My webhost uptime is ~ 92%… if no answer pls call again later!]]


#3

i think you can do
::open

require ‘open-uri’

class C
def open(uri)
::open(uri)
end
end

o = C.new
o.open(‘x’)


open.rb:6: syntax error, unexpected tIDENTIFIER, expecting tCONSTANT
::open(uri)
^


#4

Mirek wrote:

end

o = C.new
o.open(‘x’)


open.rb:6: syntax error, unexpected tIDENTIFIER, expecting tCONSTANT
::open(uri)
^

:: is use to find a toplevel constant, It is not used for method
lookups. ie:

A = true
class B; end
module C; end

If you are deeply nested you can work your way out by using ::

A = true
class B
class A # inner class
end

 def open
   puts "A is #{A}" #puts A::B
 end

 def open2
    puts "A is #{::A}" #puts true, because our toplevel constant A 

is true
end
end

It is more useful when you are inside of a class or module namespace,
and you have an inner class
with a clashing or similar name. E.g: Socket or String, and instead of
using that one, you want to
use the toplevel namespace to find what you are looking for.

The code “require ‘open-uri’” actually adds the private method ‘open’
to to the Kernel module. The
Kernel module is included (or as folks call it, mixed in) in Object.
Every class inherits from
Object, so every class gets the new private open method.

So for your example you could invoke super in your open call to make
sure it gets passed up the
chain to Kernel#open.:

require ‘open-uri’

class C
def open(uri)
super
end
end

o = C.new
o.open(‘x’)

Hope this helps,

Zach


#5

Hi,

You can always provide full path to your desired method, like this:

class C
def open(uri)
Kernel::open(uri) # open-uri has overriden Kernel::open method
end
end


Martins


#6

Kernel::open, that’s what i was thinking of. Next time i’ll actually
test stuff before I post an answer for someone :frowning:

;Daniel

On 29/03/06, Marcin MielżyÅ?ski removed_email_address@domain.invalid wrote:

lopex


Daniel B.
http://danielbaird.com (TiddlyW;nks! :: Whiteboard Koala :: Blog ::
Things
That Suck)
[[My webhost uptime is ~ 92%… if no answer pls call again later!]]


#7

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Daniel B. wrote:

Kernel::open, that’s what i was thinking of. Next time i’ll actually
test stuff before I post an answer for someone :frowning:

Well now you know how :: works when there is nothing preceding it, and
you know that OpenURI modifies the Kernel#open and
Kernel::open methods. This is probably good thread for other folks to
read also, don’t fear posting!

Zach
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFEK0AUMyx0fW1d8G0RAkS7AJ9zQIr+a8ZQDsVKOJ9uFBo7WlixJQCeKnUi
NaZZAhEnYyjdtlYE5pkR2Ms=
=1396
-----END PGP SIGNATURE-----


#8

Mirek wrote:

class C
def open()
# how to call global open function from here?
end
end

Kernel::open

lopex