[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Scope resolution operator

Daniel Waite

1/25/2009 12:19:00 AM

(The code I will demonstrate is Rails-based, but the question is
Ruby-based.)

I'm familiar with the following:
ActiveRecord::Base

Basically says, look inside ActiveRecord for a class or module named
Base.

But what about the following:

::Attachment

Does that basically say, no matter what scope you are in, jump to the
highest level to look for the class or module named Attachment?

The following code only works when I prefix the Attachment class with ::

has_one :attachment, :as => :attachable, :class_name => '::Attachment'

def assign_attachment=(attachment_id)
self.attachment = ::Attachment.find(attachment_id)
end
--
Posted via http://www.ruby-....

4 Answers

Stefano Crocco

1/25/2009 8:13:00 AM

0

Alle domenica 25 gennaio 2009, Daniel Waite ha scritto:
> (The code I will demonstrate is Rails-based, but the question is
> Ruby-based.)
>
> I'm familiar with the following:
> ActiveRecord::Base
>
> Basically says, look inside ActiveRecord for a class or module named
> Base.
>
> But what about the following:
> ::Attachment
> Does that basically say, no matter what scope you are in, jump to the
> highest level to look for the class or module named Attachment?

According to "The Ruby Programming Language", ::Something is a shortcut for
Object::Something. The idea is that ::Something should look up a constant
called Something in the global scope, but since ruby doesn't truly have a
global scope, it looks it up in the Object class, which is the nearest thing
in ruby to a global scope.

> The following code only works when I prefix the Attachment class with ::
>
> has_one :attachment, :as => :attachable, :class_name => '::Attachment'
>
> def assign_attachment=(attachment_id)
> self.attachment = ::Attachment.find(attachment_id)
> end

Not knowing rails, I can't say much on this. However, if it works with
::Attachment and doesn't work with Attachment, the only thing I can think of
is that you have two constants called Attachment: one at global level, which
is the one you need here, and another at a more local level which is the one
you get without the ::

I hope this helps

Stefano

Daniel Waite

1/25/2009 8:53:00 AM

0

Stefano Crocco wrote:
> Not knowing rails, I can't say much on this. However, if it works with
> ::Attachment and doesn't work with Attachment, the only thing I can
> think of
> is that you have two constants called Attachment: one at global level,
> which
> is the one you need here, and another at a more local level which is the
> one
> you get without the ::

You may not be familiar with Rails but you certainly know Ruby. That is
exactly the case. The Paperclip module defines an Attachment class,
methods of which I am using in my own Attachment class. Talk about a
naming conflict. Grr...

Thanks for the reply Stefano, it's helped a lot.
--
Posted via http://www.ruby-....

Robert Klemme

1/27/2009 1:53:00 PM

0

2009/1/25 Stefano Crocco <stefano.crocco@alice.it>:
> Alle domenica 25 gennaio 2009, Daniel Waite ha scritto:
>> (The code I will demonstrate is Rails-based, but the question is
>> Ruby-based.)
>>
>> I'm familiar with the following:
>> ActiveRecord::Base
>>
>> Basically says, look inside ActiveRecord for a class or module named
>> Base.
>>
>> But what about the following:
>> ::Attachment
>> Does that basically say, no matter what scope you are in, jump to the
>> highest level to look for the class or module named Attachment?
>
> According to "The Ruby Programming Language", ::Something is a shortcut for
> Object::Something. The idea is that ::Something should look up a constant
> called Something in the global scope, but since ruby doesn't truly have a
> global scope, it looks it up in the Object class, which is the nearest thing
> in ruby to a global scope.

As an illustration:

14:52:57 ~$ ruby -e 'puts Object.constants.sort'
ARGF
ARGV
ArgumentError
Array
Bignum
Binding
Class
Comparable
Continuation
Data
Dir
ENV
EOFError
Enumerable
Errno
Exception
FALSE
FalseClass
File
FileTest
Fixnum
Float
FloatDomainError
GC
Hash
IO
IOError
IndexError
Integer
Interrupt
Kernel
LoadError
LocalJumpError
Marshal
MatchData
MatchingData
Math
Method
Module
NIL
NameError
NilClass
NoMemoryError
NoMethodError
NotImplementedError
Numeric
Object
ObjectSpace
...

You see all the globally scoped classes (later on there will be String
etc.). Notice also the nice element of self referentiality. :-)

Kind regards

robert

--
remember.guy do |as, often| as.you_can - without end

Simon Krahnke

1/28/2009 6:58:00 PM

0

* Stefano Crocco <stefano.crocco@alice.it> (2009-01-25) schrieb:

> According to "The Ruby Programming Language", ::Something is a shortcut for
> Object::Something. The idea is that ::Something should look up a constant
> called Something in the global scope, but since ruby doesn't truly have a
> global scope, it looks it up in the Object class, which is the nearest thing
> in ruby to a global scope.

,----
| $ cat /tmp/scope.rb
| Something = "blubb"
|
| module Bla
| class Object
| Something = "crazy"
| end
|
| puts ::Something
| puts Object::Something
| end
| $ ruby /tmp/scope.rb
| blubb
| crazy
| $
`----

mfg, simon .... l