Hey Everyone,
Vinsol is proudly taking charge to spread Rubyism in delhi and to grow the Ruby & Rails communities here in New Delhi, India. We are organizing delhi.rb meetups around once every month, the meetup is all about ruby and rails as well. The meetup was on 19th July 2007 was our second meetup, first was on 22nd June 2007.
Manik presenting SOLR

Me presenting Some Advance Ruby Skills
More photos here.
It was really a nice experience attending the meetup, sharing the ruby/rails thoughts and upcoming features. It helps keeping yourself up-to-date with the latest trends in this technology domain at least in Ruby and Rails(what else m talking except ruby :D). So, there were two presentations in the meetup — first Manik presented Full text search implementation for Rails using SOLR(it was really an interesting presentation, i got SOLR learning for free, thanks Manik :)), second I presented Some Advance Ruby Skills which i am going to share in this post too. Though in the first meetup I presented Caching on RubyOnRails but i haven’t posted here…
Some Advance Ruby Skills
1.) Everything is object
A popular phrase about Ruby, “Everything is Object”. At the root of the ruby it is Object. Everything we define in ruby is object. Even the classes we define are actually object. A class defined with class ClassName; end is actually an object of the class Class.
The Object keeps the record of whatever class or module we define. We can justify it as
2.) module_eval
Use module_eval to define instance and class methods of a class at runtime, when you are outside the class.
example 1
defining an instance method
C.module_eval do
define_method :wish do
p “hello instance method”
end
end
c = C.new
c.wish # => hello instance method
example 2
defining a class method
C.module_eval do
class << self
define_method :wish do
p "hello class method"
end
end
end
C.wish # => hello class method
example 3
another form of using module_eval
when method body is available as a String object
class C
end
c = C.new
c.class.module_eval(D.method_body)
c.wish # => hello, supplied as String object
end
3.) alias_method
It is NOT method call delegation but insertion of customized functionalities on a specific method call.
def wish
p “hello”
end
end
c = C.new
c.wish # hello
class D
class << self
def keep_some_record
p "I am keeping some records"
end
end
end
# aliasing the wish method
c.class.module_eval do
alias_method :wish_orig, :wish
define_method :wish do
D.keep_some_record
wish_orig
end
end
c.wish # I am keeping some records; hello
4.) The Anonymous class
I just presented same a la this post
5.) send
Calling a method when method name is stored as a string object in a variable i.e. you can not see which method to call.
example 1
when method name is simply stored as a String object
example 2
making set method at runtime
c = C.new
a = “name”
c.send(a + “=”, “SUR MAX”)
p c.send(a)
example 3
this is interesting, when attribute name itself is send
c = C.new
a = “send”
c.__send__(a + “=”, “SUR MAX”)
p c.__send__(a) # => Sur Max
well, don’t say “what if attribute name is __send__”
6.) The Method class
Methods of the class are objects of the Method class when retrieved with the method method and can be called with the method call.
example 1
anything we define with def-end is an object of the class Method
c = C.new
m1 = c.method(”wish”)
p m1.class # => Method
m1.call # => hello
example 2
method can hold the object’s reference and associated instance variables
def initialize(name)
self.name = name.to_s
end
def wish
p “hello ” + name.to_s
end
end
c = C.new(”Sur Max”)
m1 = c.method(”wish”)
m1.call # => hello Sur Max
example 3
we are able to let this method object flow throughout the application code and let it available anywhere in the code.
def initialize(name)
self.name = name.to_s
end
def wish
p “hello ” + name.to_s
end
def self.supply_wish
c = new(”Sur Max”)
return c.method(”wish”)
end
end
C.supply_wish.call # => hello Sur Max
7.) what is “self”
I just presented a la this post
8.) Single Method Delegation – using Forwardable
Allows you to delegate named method calls to other objects.
class C
extend Forwardable
attr_accessor :h
def initialize
@h = {}
end
def_delegator(:@h, :[], :show)
def_delegator(:@h, :[]=, :add)
end
end
c = C.new
c.add(1, “asdf”)
p c.show(1)
p c.h
Notice the beauty of ruby here… The methods [], []= of a hash object are usually called as
BUT in the above delegation code we are calling them as(delegating the method call on them as)
9.) Full class Delegation – using Delegator
Extending an object(instance of Class) with the capabilities of another.
class Words < DelegateClass(Array)
def initialize(list = "one two three four")
super(list.split)
end
end
w = Words.new
p w # => ["one", "two", "three", "four"]
p w.length # => 4
10.) SimpleDelegator
Write memory optimized code with SimpleDelegator…
a = SimpleDelegator.new([10, 20])
old_id = a.__id__
b = a
a.__setobj__(”a new object”) # this is not possible otherwise with the method “replace” which can replace only object of same class on same memory location
new_id = a.__id__
p a # => “a new object”
p b # => “a new object”
p new_id == old_id # => true
No related posts.
Related posts brought to you by Yet Another Related Posts Plugin.

