Wednesday, June 13, 2007
Blogging and Ruby
Sunday, June 10, 2007
Passing multiple functions/closures
Here’s the class that we’ll be using
class A
# This method will just take a simple block
def test1
yield if block_given?
end
# This method is taking a block as a parameter
def test2(&block)
block.call if block_given?
end
# This method takes 2 closures
def test3(func1, func2)
func1.call
func2.call
end
end
And here’s the different ways of passing blocks/closures
# Here is the basic block
a = A.new
a.test1 { puts 'A' }
a.test2 { puts 'B' }
# Here's how to pass multiple functions using lambdas
function1 = lambda { puts 'C' }
function2 = lambda { puts 'C' }
a.test3(function1, function2)
# Here's another way using Procs (lambdas are usually recommended)
function3 = Proc.new { puts 'D' }
function4 = Proc.new { puts 'D' }
a.test3(function3, function4)
# And yet another way
def callback
puts 'E'
end
# If you wanted to use a method from within a class you would do
# = classInstance.method(:methodName)
function5 = method(:callback)
function6 = method(:callback)
a.test3(function5, function6)
One thing you’ll want to consider is that if you want to use a return statement in any of these then you will only get the expected result from the last two scenarios above. If you place a return statement in the others they will return to the caller whereas the lambda and method ways will return only from the closure.
Saturday, June 9, 2007
Ruby editors?
I usually code in c# so figuring out which editor to use is pretty much a no-brainer. Well with Ruby there is a little bit more of a choice. When I first started looking into Ruby I had been using the RDT plugin for Eclipse which was great but I noticed recently that they haven't been doing much with it. This doesn't mean it's bad or anything, I mean it still works like it did before, I just thought that maybe there were bigger and better things now-days. So my quest began. I remembered RadRails but wanted something that was good for plain Ruby development and Rails development. RadRails was basically for Rails. I looked into just using Emacs, but I wanted something that could debug and do all the fancy things I was used to. There was ActiveState's Komodo IDE which looked really great until I saw that there was a price tag, and a hefty one too for someone like me who was just tinkering. Then I finally stumbled accross TextMate and Aptana's RadRails. These are both really good (TextMate is only really good if you have a Mac though, no Windows/*nix versions). I noticed that everyone on the Rails team uses TextMate, but I've used Eclipse before for Java dev and really liked it so I was kinda stuck.
Yes yes I have the RadRails in there 2x. The story behind this is that when I first started looking into Ruby RadRails was mainly for Rails and that was it. Now the Company Aptana has taken RadRails project AND the RDT project and melded them together. So now you can get both the Aptana + Rails config and it works for plain Ruby or Rails stuff, it also has lots of nice features for css/html/javascript editing.
So I guess the biggest thing for me right now is the price. TextMate is great and everything.. but it's 39 Euros (About $53 US) and Aptana's RadRails is free and is completely focused on Ruby only whereas TextMate is a text editor for lots of things.
Upgrading to Ruby 1.8.6 on OS X
So I've been playing around with Ruby and decided I also wanted to learn the Rails framework while I continue my Ruby learning. I mean Rails is pretty much the big driving force of me learning Ruby so I might as well learn both at the same time. So anyhow I do my Ruby development in OS X which comes with Ruby 1.8.2 by default (OS X 10.4). I wanted to upgrade to the latest stable (1.8.6) but didn't want to spend a lot of time playing around in the shell. I could do it in the shell I suppose, but I'm not that big of a geek anymore :). So here's what I did to get everything up and going..
Step one - I downloaded MacPorts and installed it (easy enough)
Step two - after MacPorts was installed I opened up a shell and typed in 'sudo port upgrade ruby'
Step three - I downloaded RubyGems and un-compressed it
Step four - another shell and 'sudo ruby setup.rb' from the un-compressed gems folder
Step five - another shell and 'sudo gem install rails --include-dependencies
Done!
well.. not so fast.. I did run into a little show-stopper when I tried installing Rails from RubyGems. I kept getting an exception when trying to retrieve any gems. After a little Googling around I found that there were quite a few people that have experienced the gems not working. The problem ended up being the gem cache. When trying to pull a gem from the server it wouln't find it and throw an exception. So to fix it I pulled up a shell and typed in 'gem env', which prints the environment settings of RubyGems, then grabbed the path info ('/opt/local/lib/ruby/gems/1.8'). Once I got into the gem path directory I deleted 'source_cache'. I guess this fixed many peoples issues, I ended up having to re-install RubyGems to get it working. Oh well all is good now though.
Saturday, June 2, 2007
Singletons in Ruby
I've used singletons quite a bit in c#, but have never really used them in any dynamic languages (Python, Ruby) that I've used. I found two different approaches to this and will post them both with a few explanations...
The first (which looks somewhat familiar)
class SingletonClass
private_class_method :new
@@singletonClass = nil
def SingletonClass.instance
@@singletonClass = new unless @@singletonClass
@@singletonClass
end
end
The first line is just a simple class declaration
Line two (which is a little different if you're coming from another language, like me:) ) makes the 'new' call to this class private so you cannot directly create new instances. "private_class_method makes existing class methods private".
Then we have our method that returns the instance of our singleton class
Line five will set the variable '@@singletonClass' to a new instance of the class unless it has already been set.
Now lastly my most undesired feature in Ruby. The single line "@@singletonClass" returns the variable. In Ruby every method returns the last thing. Since our last line was our variable that is what is returned.
The second (quite a bit different than what I'm used to)
require 'singleton'
class SingletonClass2
include Singleton
end
Whoa! that's it? That's all you need to do for the second approach.
The third line ('include Singleton') is taking advantage of a Ruby feature called mixins.
My new Ruby blog!
I started learning Ruby a little over a year and a half ago. I bought a Ruby book and read through it, but never really did anything with it. My boss came in the other day and announced that he wanted to get back in the coding game, so he was gonna start tinkering with RoR. This kinda triggered me to want to get back into the Ruby stuff again. So I started this blog to post stuff I want to remember as I learn the language.