Ruby presentasjon på NTNU 22 april 2009 - Presentation Transcript
Ruby
Aslak Hellesøy / Øystein Ellingbø
Consulting
Yukihiro “Matz”
Matsumoto
1993-02-24: Matz starts hacking on Ruby
1995-12-21: Matz released Ruby on fj.sources
1999: First book in Japanese
2000: First book in English
Ruby
Sapir-Whorf Hypothesis
People who speak different
languages perceive and think
about the world quite differently
People's thoughts are determined by the
categories made available by their language
Differences among languages cause
differences in the thought of their speakers
Any language that does change the way you
think about programming isn't worth learning
Everything is an Object
# Classes are objects
hash = Hash.new
# Numbers are objects
-1.abs # => 1
# Even nil is an object
a = nil
a.nil? # => true
Classes
class MyClass
end
o = MyClass.new
puts o
# #<MyClass:0x355e94>
Methods
class MyClass
def hello(name)
\"Hi, #{name}\"
end
end
o = MyClass.new
puts o.hello(\"Bob\")
# Hi, Bob
Operators are methods
2+2 list << 'a'
2.+(2) list.<<('a')
x == 5
x.==(5)
Method arguments
def no_args
end
def two_args(foo, bar)
end
def varargs(foo, *bar)
puts bar.class # => Array
end
def with_proc(foo, &proc)
proc.call(\"Chunky\", \"bacon!\")
end
Method Signatures
def weirdo(x)
if x == 5
\"Bingo\"
else
23
end
end
puts weirdo(5) # => \"Bingo\"
puts weirdo(\"Sponge\") # => 23
Dynamic Typing
\"x\" + 5 # TypeError: can't convert Fixnum into String
a = 'hi'
a = [] # a's type is carried by the value
puts a.class # => Array
def quack_it(o)
o.quack
end
quack_it(duck) # OK, Duck has a quack method
quack_it(horse) # NoMethodError: undefined method 'quack'
It is still Typing
• Objects are still strongly typed
• You can not tell an object to be another
type
• But you can tell a variable to point to
an object of a different type
• You can ask an object its type
• But don’t
• Instead, ask what it can do
Open Classes
Add Behaviour to
Existing Classes
class Object
def introduce_thyself
\"Hello, I am an instance of #{self.class}\"
end
end
puts \"NDC\".introduce_thyself
# => Hello, I am an instance of String
puts 5.introduce_thyself
# => Hello, I am an instance of Fixnum
puts lambda {}.introduce_thyself
# => Hello, I am an instance of Proc
puts 5.even?
puts 8.even?
# false
# true
require 'rubygems'
require 'activesupport'
puts 2.days.ago
$ ruby days.rb
Sat Jun 14 13:55:51 +0200 2008
Iterators
a = [2, 3, 5]
a = [2, 3, 5]
b = a.map do |e|
a.each do |e|
e*e
puts e
end
end
#2
puts b.inspect
#3
# [4, 9, 25]
#5
h = {'x' => 99, 'y' => 98}
h.each do |k, v|
puts \"#{k} => #{v}\"
end
# x => 99
# y => 98
print_down_to_0(5)
#5
#4
#3
#2
#1
#0
Strings
• Similar “feel” to Java and C#, except
• Mutable
• No Unicode (getting there)
s = \"A String\"
puts s # => A String
puts s.object_id # => 9428360
s.gsub!(\"ing\",\"and\")
puts s # => A Strand
puts s.object_id # => 9428360
Symbols
• Immutable Strings
• Mostly used as keys in hashes
• Flyweight
x = :foo
y = :foo
puts x.equal?(y) # object identity
# => true
Metaprogrammerin
def method_missing(name, *args)
end
r = ReverseAnything.new
puts r.olleh
# hello
Blocks / yield
def i_yield(&proc)
def i_yield
proc.call('hi')
yield 'hi'
end
end
i_yield do |what|
puts what
end
# hi
(1...10).each_even do |e|
puts e
end
#2
#4
#6
#8
(1...10).each_even { |e| puts e }
Modules
module Happiness
def happy?
true
end
end
class RubyDeveloper
include Happiness
end
Namespaces
module Awesome
class Stuff
end
end
s = Awesome::Stuff.new
Regular Expressions
• Find words and patterns in strings
• Validation
• Extract substrings
• Used heavily in Ruby, Perl, Python and Javascript
• \\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b
Regular Expressions
String text = \"Aslak is 181cm tall\";
MatchCollection m = Regex.Matches(text, @\"(\\d+)cm\");
C#
if (m.Success)
{
Console.WriteLine(m[0].Groups[1].Value);
}
String text = \"Aslak is 181cm tall\";
Pattern p = Pattern.compile(\"(\\\\d+)cm\");
Java Matcher m = p.matcher(text);
if(m.find()) {
System.out.println(m.group(1));
}
text = \"Aslak is 181cm tall\"
Ruby
if text =~ /(\\d+)cm/
puts $1
end
Resources
http://ruby-lang.org/
http://rubyforge.org/
http://rubyquiz.com/
http://tryruby.hobix.com/
+ thousands of blogs and lists
0 comments
Post a comment