[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Functions scope

Mirek

3/29/2006 6:55:00 AM


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

--
Posted via http://www.ruby-....


7 Answers

Daniel Baird

3/29/2006 6:59:00 AM

0

i think you can do

::open

;D

On 29/03/06, Mirek <mirek.rusin@onet.pl> wrote:
>
>
> class C
> def open()
> # how to call global open function from here?
> end
> end
>
> --
> Posted via http://www.ruby-....
>
>


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

Mirek

3/29/2006 7:36:00 AM

0

> 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)
^

--
Posted via http://www.ruby-....


Zach Dennis

3/29/2006 8:13:00 AM

0

Mirek wrote:
>>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)
> ^
>

:: 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


13

3/29/2006 8:17:00 AM

0

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


On 3/29/06, Mirek <mirek.rusin@onet.pl> wrote:
> > 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)
> ^
>
> --
> Posted via http://www.ruby-....
>
>


Marcin Mielzynski

3/29/2006 11:02:00 AM

0

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

Kernel::open


lopex

Daniel Baird

3/30/2006 12:57:00 AM

0

Kernel::open, that's what i was thinking of. Next time i'll actually*test* stuff before I post an answer for someone :(;DanielOn 29/03/06, Marcin Mielzynski <lopexx@autograf.pl> wrote:>> Mirek wrote:> > class C> > def open()> > # how to call global open function from here?> > end> > end> >>> Kernel::open>>> lopex>>--Daniel Bairdhttp://danie... (TiddlyW;nks! :: Whiteboard Koala :: Blog :: ThingsThat Suck)[[My webhost uptime is ~ 92%.. if no answer pls call again later!]]

Zach Dennis

3/30/2006 2:16:00 AM

0

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

Daniel Baird wrote:
> Kernel::open, that's what i was thinking of. Next time i'll actually
> *test* stuff before I post an answer for someone :(
>

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....

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