Skip to content

maiha/typed

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
lib
 
 
 
 
 
 
 
 
 
 
 
 

typed

A Ruby library for Typed variables

DESCRIPTION:

No more “NoMethodError: undefined method”! We need some typed variables to avoid silly and stealth mistakes.

# Ruby
irb> name = "foo"
irb> name = 10

# Scala
scala> var name = "foo"
scala> name = 10
<console>:8: error: type mismatch;

# Ruby + typed.gem
irb> vars = Typed::Hash.new
irb> vars[:name] = "foo"
irb> vars[:name] = 10
TypeError: name(String) got Fixnum: 10

SYNOPSIS:

>> vars = Typed::Hash.new
=> {}

# Class/Module means not values but type definitions
>> vars[:num] = Numeric
>> vars[:num] = 10
=> 10
>> vars[:num] = "a"
TypeError: num(Numeric) got String: "a"

# Types are automatically guessed
>> vars[:foo] = 10
=> 10
>> vars[:foo] = "a"
TypeError: foo(Fixnum) got String: "a"

# Referrence without assigned raises error
>> vars[:xxx]
Typed::NotDefined: 'xxx' is not initialized

# Hash/Array can be used for complex schema.
>> vars[:services] = {Integer => [{Symbol => String}]}
>> vars[:services] = {
     21 => [{:tcp => "ftp"}, {:udp => "fsp"}],
     25 => [{:tcp => "smtp"}],
   }
=> {25=>[{:tcp=>"smtp"}], 21=>[{:tcp=>"ftp"}, {:udp=>"fsp"}]}
>> vars[:services] = {22 => {:tcp => "ssh"}}
TypeError: services({Integer=>[{Symbol=>String}]}) got {Fixnum=>{Symbol=>String}}: {22=>{:tcp=>"ssh"}}

Changes

# changes object tells whether a key is changed or not
>> vars = Typed::Hash.new
>> vars.changes.keys
=> [] 
>> vars[:a] = 1
>> vars.changes.keys
=> ["a"] 
>> vars.changes.reset
>> vars.changes.keys
=> []

Events

# events allows user to use callback about :read,:write
>> vars = Typed::Hash.new
>> vars[:a] = 1
>> vars.events.on(:read){|k,v| puts "reading #{k}"}
>> vars[:a]
reading a
=> 1

Experimental : Typed::Scala

Love ‘val’, ‘var’ of Scala!!

# [NOTE] val and var must be written in source files.
% cat user.rb
class User
  include Typed::Scala
  val nick  = String
  var pass  = String
end
% bundle exec irb -r typed -r user
>> u = User.new
>> u.nick
Typed::NotDefined: 'nick' is not initialized
>> u.nick = "maiha"
>> u.nick = "no name"
=> Typed::FixedValue: reassignment to nick

REQUIREMENTS:

  • activesupport gem

  • must gem

CAUTIONS:

  • Typed::Hash can’t assign Class/Module cause they are treated as type definitions

  • must gem adds Object#must method

  • All keys are forced to String [since: verson 0.2.0]

INSTALL:

sudo gem install typed

DOCUMENT:

LICENSE:

(The MIT License)

Copyright © 2012 maiha@wota.jp

About

A Ruby library for Typed variables

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages