File::open and File.open

What exactly is the difference between these? :: is a class method while
. is an instance method??? If that is so, could someone clarify this
with more detail? I use File.open, but File::open works too. However
sometimes, this is not the case which adds to my confusion :slight_smile: For
example, I can only do Digest::MD5.new() and not Digest.MD5.new() why is
that?

I don't fully understand OO programming... perhaps this is my problem.

Thank you for your time.

路路路

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

This is just Ruby syntax. It allows both :: and . as operators to
class-level methods and variables.

File::open and File.open are the exact same thing: a class method. Were it
an instance method, you would have to do:

file = File.new
file.open

aka, create an instance of the object, then call the function. For
confusions sake, this is the same as:

file = File::new
file.open

Jason

路路路

On 10/23/06, Brad Tilley <rtilley@vt.edu> wrote:

What exactly is the difference between these? :: is a class method while
. is an instance method??? If that is so, could someone clarify this
with more detail? I use File.open, but File::open works too. However
sometimes, this is not the case which adds to my confusion :slight_smile: For
example, I can only do Digest::MD5.new() and not Digest.MD5.new() why is
that?

I don't fully understand OO programming... perhaps this is my problem.

Thank you for your time.

--
Posted via http://www.ruby-forum.com/\.

Brad Tilley wrote:

What exactly is the difference between these? :: is a class method while is an instance method??? If that is so, could someone clarify this with more detail? I use File.open, but File::open works too.

The same method (a class method) is called. It is just a syntactic difference. So these are the same

File.open("foo") ...
File::open("foo") ...

> However

sometimes, this is not the case which adds to my confusion :slight_smile: For example, I can only do Digest::MD5.new() and not Digest.MD5.new() why is that?

Because the "." cannot be used for constant lookup:

irb(main):005:0> File.NONBLOCK
NoMethodError: undefined method `NONBLOCK' for File:Class
         from (irb):5
irb(main):006:0> File::NONBLOCK
=> 16384

"." is reserved for method invocations.

I don't fully understand OO programming... perhaps this is my problem.

Nah, I think it is rather a minor ambiguity in the language that causes confusion. Usually people disambiguate it by using "." for methods and "::" for constants only although they could use it for class methods as well.

Kind regards

  robert

路路路

from :0

Thank you Robert and Jason. I understand that much better now!

路路路

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

Robert Klemme schrieb:

Brad Tilley wrote:

What exactly is the difference between these? :: is a class method while is an instance method??? If that is so, could someone clarify this with more detail? I use File.open, but File::open works too.

The same method (a class method) is called. It is just a syntactic difference. So these are the same

File.open("foo") ...
File::open("foo") ...

> However

sometimes, this is not the case which adds to my confusion :slight_smile: For example, I can only do Digest::MD5.new() and not Digest.MD5.new() why is that?

Because the "." cannot be used for constant lookup:

irb(main):005:0> File.NONBLOCK
NoMethodError: undefined method `NONBLOCK' for File:Class
        from (irb):5
        from :0
irb(main):006:0> File::NONBLOCK
=> 16384

"." is reserved for method invocations.

I don't fully understand OO programming... perhaps this is my problem.

Nah, I think it is rather a minor ambiguity in the language that causes confusion. Usually people disambiguate it by using "." for methods and "::" for constants only although they could use it for class methods as well.

I was bitten by it more than once
is there more to it ... i mean ambiguity is usually not what one wants to have in the language (at least not in the computer language :slight_smile:

Regards, Daniel

And when talking about instance methods one sometimes uses

classname#method name

Since this is what ri understands when you ask for documentation:

$ri to_s
More than one method matched your request. You can refine
your search by asking for information on one of:

     Method#to_s, Vector#to_s, Struct#to_s, Time#to_s, CGI::Cookie#to_s,
     Array#to_s, Matrix#to_s, MatchData#to_s, FalseClass#to_s,
     Pathname#to_s, Pathname#to_str, Rational#to_s, Hash#to_s,
     UnboundMethod#to_s, TrueClass#to_s, Module#to_s, Complex#to_s,
     Proc#to_s, Symbol#to_s, Symbol#to_sym, Exception#to_s,
     Exception#to_str, Bignum#to_s, Object#to_s, NilClass#to_s,
     Range#to_s, Date#to_s, NameError#to_s, Fixnum#to_s, Fixnum#to_sym,
     Float#to_s, String#to_s, String#to_str, String#to_sym, Regexp#to_s,
     Benchmark::Tms#to_s, URI::MailTo#to_s, URI::FTP#to_s,
     URI::Generic#to_s, Process::Status#to_s, Enumerable#to_set

$ri Object#to_s
------------------------------------------------------------ Object#to_s
     obj.to_s => string

路路路

On 10/23/06, Jason Roelofs <jameskilton@gmail.com> wrote:

This is just Ruby syntax. It allows both :: and . as operators to
class-level methods and variables.

File::open and File.open are the exact same thing: a class method. Were it
an instance method, you would have to do:

file = File.new
file.open

------------------------------------------------------------------------
     Returns a string representing _obj_. The default +to_s+ prints the
     object's class and an encoding of the object id. As a special case,
     the top-level object that is the initial execution context of Ruby
     programs returns ``main.''

And, by the way, the open method in question is really a class method
of IO rather than File, the File class inherits it.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

IPMS/USA Region 12 Coordinator
http://ipmsr12.denhaven2.com/

Visit the Project Mercury Wiki Site
http://www.mercuryspacecraft.com/