!SLIDE subsection
This section is intended as a brief, lightweight overview of the Ruby language; following sections will cover all these topics in much more detail. Students are encouraged to ask questions, but instructors are encouraged to answer, "We'll cover that later."
Matz (Yukihiro Matsumoto), Ruby creator, says:
"I believe people want to express themselves when they program. They don't want to fight with the language."
"Programming languages must feel natural to programmers."
"I tried to make people enjoy programming and concentrate on the fun and creative part of programming when they use Ruby."
"For me the purpose of life is partly to have joy. Programmers often feel joy when they can concentrate on the creative side of programming, So Ruby is designed to make programmers happy."
"I wanted a scripting language that was more powerful than Perl, and more object-oriented than Python."
- Ruby has a humane interface
- many ways to do things
- Ruby favors readability and variety over concision and perfection
- sometimes makes code hard to understand (but usually makes it easier)
- contrast to minimal interface
- one (or a few) "right" ways to do things
- Python has a minimal philosophy
- Ruby 1.0 released in 1996
- Fully Open Source
- MRI 1.8.7
- MRI 1.9.2 or 1.9.3
- JRuby
- Interpreted
- Dynamically typed
- Object oriented
- Blocks / lambdas / closures
- Perl-like regular expressions
- Closely tied to shell & OS
@@@ ruby
$ irb
>> 4
=> 4
>> 4+4
=> 8
Please fire up irb
on your computer and try this out right now!
@@@ ruby
>> 2.class
=> Fixnum
>> 2.to_s
=> "2"
>> 2.to_s.class
=> String
@@@ ruby
>> 2 + 2
=> 4
>> (2+2).zero?
=> false
>> if true then "yes" end
=> "yes"
>> if false then "yes" end
=> nil
>> puts "foo"
foo
=> nil
The output is foo\n
but the value is nil
.
print
prints its argputs
prints its arg plus a newlinep
inspects and prints its arg plus a newline
pp
pretty-prints its arg plus a newlinerequire "pp"
d
is even prettier thanpp
- provided by the
wrong
gem require "wrong"; include Wrong::D
- if x is 10,
d { x }
printsx is 10
- provided by the
-
Blocks can also take parameters or return a value
-
e.g. the
map
iterator translates each item in an array into a new array@@@ ruby >> ["hello", "world"].map {|string| string.upcase} => ["HELLO", "WORLD"]
-
{|string| string.upcase}
defines a block
- Chaining is a really cool and powerful Ruby idiom
- It depends on these three features:
- Every expression has a value
- Every value is an object
- Iterators are loops inside methods
- So you can call a method on anything
- including the result of an iterator
s = "my dog has fleas"
Without chaining:
words = s.split
words = words.map{|word| word.capitalize}
s = words.join(" ")
With chaining:
s = "my dog has fleas"
s.split.map{|word| word.capitalize}.join(" ")
-
semicolons, parens, and
return
are optional -
These are equivalent:
@@@ ruby def inc(x) return x + 1; end def inc x x + 1 end def inc(x); x + 1; end def inc(x) x + 1; end
Other languages are prose:
@@@ Java
public String titleize(s) {
String words = s.split(" ");
String titleized = "";
for(int i =0; i < words.length ; i++) {
char capLetter = Character.toUpperCase(words[i].charAt(0));
String capWord = capLetter + words[i].substring(1, words[i].length());
titleized += capWord + " ";
}
return titleized.trim();
}
Ruby is poetry:
@@@ Ruby
def titleize s
s.split.map{|word| word.capitalize}.join(" ")
end
Cf. declarative vs. algorithmic
@@@ ruby
x = 1 + 2
x #=> 3
x = 1
+ 2
x #=> 1
Solution: always put operators on top line
x = 1 +
2
x #=> 3
@@@ ruby
>> "Hello".gsub "H", "h"
=> "hello"
>> "Hello".gsub "H", "h".reverse
=> "hello"
>> "Hello".gsub("H", "h").reverse
=> "olleh"
@@@ ruby
# is a comment
2 + 2 # is a comment
Ruby has a syntax for multiline comments too, but it's silly and nobody uses it.
@@@ ruby
first_name = "Santa"
last_name = "Claus"
full_name = first_name + last_name
#=> "SantaClaus"
- Numbers
42
(Fixnum)3.14159
(Float)
- Booleans
true
false
- Strings
"apple"
'banana'
- Symbols
:apple
- Regular Expressions
/fo*/i
- Arrays
["apple", "banana"]
- Ranges
(1..10)
- Hashes
{:apple => 'red', :banana => 'yellow'}
{apple: 'red', banana: 'yellow'}
@@@ ruby
"boyz #{1 + 1} men"
=> "boyz 2 men"
- Any Ruby code can go inside the braces
- It gets evaluated and stuck inside the string
x = 1
means "put the value1
in the variablex
"x == 2
means "true
ifx
is2
, otherwisefalse
"x === 3
means the same as==
but sometimes more- threequal is rarely used
(The Well-Grounded Rubyist, p. 5, section 1.1.2)
@@@ ruby
def add a, b
a + b
end
add 2, 2
#=> 4
- Note: no 'return' required
def add(a, b)
is also legal
Are you sick of hearing me speak?
If so, do a lab: 01_temperature is right up your alley.
@@@ ruby
class Calculator
def add(a,b)
a + b
end
end
calc = Calculator.new
calc.add(2, 2)
#=> 4
- a function inside a class is called a method
- A class defines a group of behaviors (methods)
- Every object has a class,
Object
if nothing else
- an object is referenced by a variable or a literal
- the dot operator (
.
) sends a message to an object - an object receives a message and invokes a method
- with no dot, the default object (
self
) is the receiver
- method names can end with
!
or?
?
means "boolean"!
means "watch out!"
methods and variables are in snake_case
classes and modules are in CamelCase
constants are in ALL_CAPS
Standard is better than better.
-- Anon.
local_variable
- start with letter or underscore, contain letters, numbers, underscored@instance_variable
- start with@
@@class_variable
- start with@@
$global_variable
- start with$
Constant
orCONSTANT
- must start with uppercase letterClassName
- capitalized camel casemethod_name?
- like a local variable, but can end with?
or!
or=
- keywords - about 40 reserved words (
def
) and weirdos (__FILE__
) - literals -
"hi"
for strings,[1,2]
for arrays,{:a=>1, :b=>2}
for hashes, etc.
@@@ ruby
var # local variable (or method call)
@var # instance variable
@@var # class variable
$var # global variable
VAR # constant
load
inserts a file's contents into the current filerequire
makes a feature available to the current file- skips already-loaded files
- omits the trailing
.rb
- can also be used for extensions written in C (
.so
,.dll
, etc.)
- "Ruby Intro" slides based on Ruby Quickstart for Refugees by Jacob Rothstein
- Improved by Alex Chaffee, Sarah Allen, Wolfram Arnold