11. Java get/set version 1
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Monday, November 1, 2010
12. .NET get/set version 1
class User
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
Monday, November 1, 2010
13. Ruby get/set version 1
class User
def name
@name
end
def name=(value)
@name = value
end
end
Monday, November 1, 2010
20. Metaprogramming
“Metaprogramming is writing code that
writes code.”
“Metaprogramming is writing code that
manipulates language constructs at runtime.”
Monday, November 1, 2010
22. Metaprogramming
• Classes are always open
• Everything is an Object even classes and
modules
• All methods calls have a receiver
Monday, November 1, 2010
23. Classes are Open
class Hash
def except!(*keys)
keys.each { |key| delete(key) }
self
end
end
hsh = {:a => 1, :b => 2}
hsh.except!(:a) # => {:b => 2}
Monday, November 1, 2010
24. Everything is an Object
class User
puts self # => User
puts self.class # => Class
end
User.methods.grep /get/
=> [:const_get,
:class_variable_get,
:instance_variable_get]
Monday, November 1, 2010
25. All method calls have a
receiver
class User
attr_accessor :name
end
Monday, November 1, 2010
27. attr_reader (class_eval)
class User
def initialize(name)
@name = name
end
attr_reader :name
end
u = User.new(‘Santiago’)
u.name # => ‘Santiago’
Monday, November 1, 2010
28. attr_reader (class_eval)
class Module
def attr_reader(sym)
class_eval “def #{sym}; @#{sym}; end”
end
end
class User
attr_reader :name # def name; @name; end
end
Monday, November 1, 2010
41. define_method
class Module
def attr_accessor_with_default(sym, default)
define_method(sym, Proc.new { default })
class_eval(<<-EVAL, __FILE__, __LINE__ + 1)
def #{sym}=(value)
class << self; attr_accessor :#{sym} end
@#{sym} = value
end
EVAL
end
end
Monday, November 1, 2010
45. method_missing
(An internal DSL)
XML.generate(STDOUT) do
html do
head do
title { ‘pagetitle’ }
comment ‘This is a test’
end
body do
h1 style: ‘font-family: sans-serif‘ do
‘pagetitle’
end
ul id: ‘info’ do
li { Time.now }
li { RUBY_VERSION }
end
end
end
Monday, November 1, 2010
47. method_missing
(An internal DSL)
class XML
def initialize(out)
@out = out
end
def content(text)
@out << text.to_s
end
def comment(text)
@out << “<!-- #{text} -->”
end
end
Monday, November 1, 2010
48. method_missing
(An internal DSL)
def method_missing(tagname, attributes={})
@out << “<#{tagname}”
attributes.each { |attr, value|
@out << “#{attr}=’#{value}’”
}
if block_given?
@out << ‘>’
content = yield
if content
@out << content.to_s
end
@out << “</#{tagname}>”
else
@out << ‘/>’
end
end
Monday, November 1, 2010
49. method_missing
(An internal DSL)
class XML
def self.generate(out, &block)
XML.new(out).instance_eval(&block)
end
end
XML.generate(STDOUT) do
# code
end
Monday, November 1, 2010
50. method_missing
(An internal DSL)
XML.generate(STDOUT) do
html do
head do
title { ‘pagetitle’ }
comment ‘This is a test’
end
body do
h1 style: ‘font-family: sans-serif‘ do
‘pagetitle’
end
ul id: ‘info’ do
li { Time.now }
li { RUBY_VERSION }
end
end
end
Monday, November 1, 2010
57. Everything about self
class User
p self # => User
class << self
p self # => <Class:User>
end
end
Monday, November 1, 2010
58. Real life use cases for
fibers?
require 'fiber'
module Eigenclass
def eigenclass
class << self; self end
end
module_function :eigenclass
public :eigenclass
end
class Object
include Eigenclass
end
Monday, November 1, 2010
59. Real life use cases for
fibers?
class EigenclassesGenerator
def initialize(obj)
@eigenclasses = [obj.eigenclass]
@fiber = Fiber.new do
loop do
Fiber.yield @eigenclasses.last
@eigenclasses[@eigenclasses.length] = @eigenclasses.last.eigenclass
end
end
end
def [](index)
if index >= @eigenclasses.length
(index - @eigenclasses.length + 2).times { @fiber.resume }
end
@eigenclasses[index]
end
end
Monday, November 1, 2010
60. Rails Magic?
class User < ActiveRecord::Base
belongs_to :bill_address
has_one :role
has_many :orders
validates_presence_of :name, :country
validates_acceptance_of :terms
validates_uniqueness_of :name
end
Monday, November 1, 2010