Do I need self in this method definition

Discussion in 'Ruby' started by Li Chen, Jun 3, 2009.

  1. Li Chen

    Li Chen Guest

    Hello everyone,

    I have two hashes. They have the same keys but different or the same
    values.
    I want to loop through one hash and print out the values in both
    hashes for the same key.I add a method to class Hash. I run the script
    and it prints out the expected results. I wonder if I have to use
    self#method in my implement.
    Thanks for all the comments.

    Li



    class Hash
    def self.my_each(hash1={}, hash2={})
    hash1.each do |k,v|
    if hash2.has_key?(k)
    print k,"\t",v,"\t", hash2[k],"\n"
    else
    print k,"\t",v,"\n"
    end
    end
    end
    end


    ##############main#############
    hash1={
    'ATC'=>1,
    'CTA'=>2,
    'CAT'=>10,
    'CCC'=>1
    }

    hash2={
    'ATC'=>3,
    'CTA'=>2,
    'CAT'=>11
    }

    Hash.my_each(hash1, hash2)
    --
    Posted via http://www.ruby-forum.com/.
     
    Li Chen, Jun 3, 2009
    #1
    1. Advertising

  2. Li Chen

    matt neuburg Guest

    Li Chen <> wrote:

    > and it prints out the expected results. I wonder if I have to use
    > self#method in my implement.
    >
    > class Hash
    > def self.my_each(hash1={}, hash2={})
    > end
    > end
    >
    > Hash.my_each(hash1, hash2)


    You do if you really want a class method - that is, if you want to be
    able to call this thing by saying Hash.my_each(hash1, hash2).

    The alternative is to make an instance method. Then you could call it by
    saying hash1.my_each(hash2). In that case, you would not use "self" in
    the def. m.

    --
    matt neuburg, phd = , http://www.tidbits.com/matt/
    Leopard - http://www.takecontrolbooks.com/leopard-customizing.html
    AppleScript - http://www.amazon.com/gp/product/0596102119
    Read TidBITS! It's free and smart. http://www.tidbits.com
     
    matt neuburg, Jun 3, 2009
    #2
    1. Advertising

  3. Li Chen

    Li Chen Guest

    matt neuburg wrote:

    > You do if you really want a class method - that is, if you want to be
    > able to call this thing by saying Hash.my_each(hash1, hash2).
    >
    > The alternative is to make an instance method. Then you could call it by
    > saying hash1.my_each(hash2). In that case, you would not use "self" in
    > the def. m.



    Thank you so much. Here is my implement of an instance method. But I
    cannot explain very clear why I can #each directly without a receiver.


    Li


    class Hash
    def my_each(hash2={})
    each do |k,v|
    if hash2.has_key?(k)
    print k,"\t",v,"\t", hash2[k],"\n"
    else
    print k,"\t",v,"\n"
    end
    end
    end

    end
    --
    Posted via http://www.ruby-forum.com/.
     
    Li Chen, Jun 3, 2009
    #3
  4. Li Chen

    matt neuburg Guest

    Li Chen <> wrote:

    > Thank you so much. Here is my implement of an instance method. But I
    > cannot explain very clear why I can #each directly without a receiver.


    Method calls are sent to "self" if they are not sent explicitly to a
    receiver. Since this is an instance method, "self" is a Hash instance.

    You *can* say "self.each" in that case if you want to. Most people
    don't; I usually do; it's a matter of style. However, in *some* cases
    (e.g. the method is private) you *can't* say "self" (because "private"
    means that an explicit receiver is not allowed). For example, that is
    why you can say

    print "hello"

    but you can't say

    self.print "hello"

    It's because "print" is an instance method of the instance you are in,
    but it's private.

    m.

    --
    matt neuburg, phd = , http://www.tidbits.com/matt/
    Leopard - http://www.takecontrolbooks.com/leopard-customizing.html
    AppleScript - http://www.amazon.com/gp/product/0596102119
    Read TidBITS! It's free and smart. http://www.tidbits.com
     
    matt neuburg, Jun 3, 2009
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Ralf W. Grosse-Kunstleve
    Replies:
    16
    Views:
    620
    Lonnie Princehouse
    Jul 11, 2005
  2. Ralf W. Grosse-Kunstleve
    Replies:
    18
    Views:
    619
    Bengt Richter
    Jul 11, 2005
  3. Ralf W. Grosse-Kunstleve
    Replies:
    2
    Views:
    427
    Dan Sommers
    Jul 12, 2005
  4. falcon
    Replies:
    0
    Views:
    401
    falcon
    Jul 31, 2005
  5. Bart Kastermans
    Replies:
    6
    Views:
    423
    Bart Kastermans
    Jul 13, 2008
Loading...

Share This Page