Forum: Ruby Functions scope

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Mirek (Guest)
on 2006-03-29 10:55
class C
  def open()
    # how to call global open function from here?
  end
end
Daniel B. (Guest)
on 2006-03-29 11:00
(Received via mailing list)
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!]]
Mirek (Guest)
on 2006-03-29 11:36
> 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)
              ^
zdennis (Guest)
on 2006-03-29 12:13
(Received via mailing list)
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
13 (Guest)
on 2006-03-29 12:16
(Received via mailing list)
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
Marcin MielżyÅ?ski (Guest)
on 2006-03-29 15:03
(Received via mailing list)
Mirek wrote:
> class C
>   def open()
>     # how to call global open function from here?
>   end
> end
>

Kernel::open


lopex
Daniel B. (Guest)
on 2006-03-30 04:59
(Received via mailing list)
Kernel::open,  that's what i was thinking of.  Next time i'll actually
*test* stuff before I post an answer for someone :(

;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!]]
zdennis (Guest)
on 2006-03-30 06:17
(Received via mailing list)
-----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 :(
>

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-----
This topic is locked and can not be replied to.