Forum: Ruby Do I need self in this method definition

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.
Li C. (Guest)
on 2009-06-03 06:17
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)
matt neuburg (Guest)
on 2009-06-03 07:00
(Received via mailing list)
Li Chen <removed_email_address@domain.invalid> 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.
Li C. (Guest)
on 2009-06-03 07:09
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
matt neuburg (Guest)
on 2009-06-03 07:40
(Received via mailing list)
Li Chen <removed_email_address@domain.invalid> 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.
This topic is locked and can not be replied to.