Ruby for XPages Programmers, Part 1
May 30, 2012, 10:54 PM
- Ruby for XPages Programmers, Part 1
Since I'm always gabbing on about Ruby, I figured it'd be useful to give an overview of the language and, in future posts, why it's worth using for XPages scripting. I don't plan to write an exhaustive tutorial for the language (they're aplenty on the web), but I'll go over the basic concepts and some of how it compares to EL, Server JavaScript, and Java.
Ruby is a dynamic, object-oriented language with functional-programming features and syntax designed for programmer-friendliness. In terms of other languages, it's sort of like a combination of Perl's general syntax, Smalltalk's object model, and (some of) Lisp's functional and metaprogramming abilities. Additionally, Ruby has its own unique features and conventions, such as optional parentheses, property-style getters and setters, and yield
statements.
Maybe the best way to provide a gentle introduction to Ruby is to show a relatively simple but contrived code example. Here is a "Point" class meant to represent a point in two-dimensional space where the X coordinate must always be positive:
class Point < Object # 1 attr_accessor :y # 2 attr_reader :x def initialize(x=0, y=0) # 3 @y = y # 4 self.x = x # 5 end def x=(x) # 6 raise Exception.new("x must be >= 0") if x < 0 # 7 @x = x end def to_s; "[#{@x}, #{@y}]"; end # 8 end
There are a lot of Ruby-isms going on, but hopefully the bulk of the code will be readable without knowing the language. Starting from the top, with a focus on the differences from Java:
- Classes are created with just
class
, with no public modifier, and must begin with a capital letter, which is the language-enforced convention for class names and constants. By unenforced convention, classes and constants are CamelCase. The "<" is equivalent to Java'sextends
. As in Java, extendingObject
is not needed, but is done here for demonstration purposes. Finally,#
is Ruby's single-line comment delimiter, like//
in Java or'
in LotusScript. attr_accessor
andattr_reader
are built-in Ruby class methods that generate getters+setters and getters only, respectively. The ":"s in:x
and:y
indicate that those are Symbols. Symbols are interesting beasts, but in this case think of them as meaning "the things named 'x' and 'y'".- The
initialize
method is equivalent to Java's constructors and LotusScript'sNew
. This one takes two parameters, but provides default values in case one or both are left out. While Ruby objects are strongly typed in that they all have a class, Ruby variables are typeless and not statically checked. - The "@" symbol is used to denote instance variables, which, like all Ruby variables, don't need to be declared before they're used the first time. In this case, the line is equivalent to "
this.y = y;
" in Java. - "
self.x = x
" is used here to indicate that the first "x" is calling the current object'sx=
method as opposed to setting the local variable "x" to itself. This line is equivalent to "this.setX(x);
" in Java. - Ruby, like C++, allows operator overloading, including this special type to define setters. This allows setting of the object's "x" parameter with code like "
some_point.x = 3
". - This line is jam-packed!
- Ruby's exceptions are essentially like Java's, except they use
raise
andbegin
/rescue
instead ofthrow
andtry
/catch
. - Objects in Ruby are constructed by calling the
new
method on the class itself, rather than havingnew
be a language keyword. - Ruby allows for conditional and looping statements at the end of single lines as syntactic sugar.
- Ruby allows parentheses to be dropped when the resultant code is unambiguous.
- Ruby's exceptions are essentially like Java's, except they use
- This line is pretty packed as well:
to_s
is Ruby's equivalent to Java'stoString()
.- Ruby, like JavaScript, uses optional semicolons. Here, they're used to pack the method definition into one line.
- When a method takes no parameters, the () after the name is optional, both in definition and in use.
- Ruby strings allow for code interpolation via
#{...}
. It's like value bindings in XPages or the equivalent feature in PHP or Perl - it allows Ruby code to be embedded in a string instead of+
-based concatenation. - Like Server JavaScript and Formula Language, the last line in a Ruby method (except in
initialize
and assignment methods) is an impliedreturn
. - By convention, Ruby uses all-lowercase underscore_separated_words for variable and method names.
That ended up being a bit more complicated than I had expected, but hopefully it's a reasonable start (if not, there are definitely better Ruby tutorials on the web). In the next post in this thread, I'll describe some other unique or unusual Ruby features and concepts, and later I'll go into some more applicable examples to explain why Ruby is worth using in XPages generally.