Class: Hash

Inherits:
Object show all
Includes:
RMTools::KeyValueTraversal
Defined in:
lib/rmtools/core/js.rb,
lib/rmtools/dev/present.rb,
lib/rmtools/enumerable/hash.rb

Overview

Javascript hash getter/setter and string concat logic

Direct Known Subclasses

RMTools::KeyValueTraversable

Instance Method Summary collapse

Methods included from RMTools::KeyValueTraversal

#depth_first_find, #depth_first_select, #depth_first_traverse, #preorder_find, #preorder_select, #preorder_traverse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object

hash = {} hash.abc = 123 hash # => “abc”=>123 hash.abc # => 123 hash.unknown_function(321) # => raise NoMethodError hash.unknown_function # => nil hash = 456 hash.def # => 456

This priority should be stable, because



16
17
18
19
20
21
22
23
24
25
26
# File 'lib/rmtools/core/js.rb', line 16

def method_missing(method, *args)
  str = method.to_s
  if str =~ /=$/
    self[str[0..-2]] = args[0]
  elsif !args.empty? or str =~ /[!?]$/
    super
  else
    a = self[method]
    (a == default) ? self[str] : a
  end
end

Instance Method Details

#+(other_hash) ⇒ Object



14
15
16
# File 'lib/rmtools/enumerable/hash.rb', line 14

def +(other_hash)
  merge(other_hash || {})
end

#any?(&block) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/rmtools/enumerable/hash.rb', line 48

def any?(&block)
 !!find(&block)
end

#idObject



33
34
35
36
# File 'lib/rmtools/core/js.rb', line 33

def id
  a = self[:id]
  (a == default) ? self['id'] : a
end

#indexObject



37
38
39
40
# File 'lib/rmtools/core/js.rb', line 37

def index
  a = self[:index]
  (a == default) ? self['index'] : a
end

#key_valueObject



77
78
79
# File 'lib/rmtools/enumerable/hash.rb', line 77

def key_value
  to_a.first
end

#map!Object

Hashes map methods that doesn’t make hash into array



373
374
375
376
# File 'ext/rmtools.cpp', line 373

def map!
  each {|k, v| self[k] = yield(k,v)}
  self
end

#map2Object

Hashes map methods that doesn’t make hash into array



62
63
64
65
66
# File 'lib/rmtools/enumerable/hash.rb', line 62

def map2
  h = {}
  each {|k, v| h[k] = yield(k,v)}
  h
end

#map_keysObject

Hashes map methods that doesn’t make hash into array New hash may get shorter than source



393
394
395
396
397
398
# File 'ext/rmtools.cpp', line 393

static VALUE rb_hash_map_keys(VALUE hash)
{
  VALUE new_hash = rb_hash_new();
  rb_hash_foreach(hash, (int (*)(ANYARGS))map_keys_i, new_hash);
  return new_hash;
}

#map_keys!Object

Hashes map methods that doesn’t make hash into array New hash may get shorter than source



355
356
357
358
359
# File 'ext/rmtools.cpp', line 355

static VALUE rb_hash_map_keys_bang(VALUE hash)
{
  rb_hash_foreach(hash, (int (*)(ANYARGS))replace_keys_i, hash);
  return hash;
}

#map_valuesObject

Hashes map methods that doesn’t make hash into array



382
383
384
385
386
387
# File 'ext/rmtools.cpp', line 382

static VALUE rb_hash_map_values(VALUE hash)
{
  VALUE new_hash = rb_hash_new();
  rb_hash_foreach(hash, (int (*)(ANYARGS))map_values_i, new_hash);
  return new_hash;
}

#map_values!Object

Hashes map methods that doesn’t make hash into array



364
365
366
367
368
# File 'ext/rmtools.cpp', line 364

static VALUE rb_hash_map_values_bang(VALUE hash)
{
  rb_hash_foreach(hash, (int (*)(ANYARGS))map_values_i, hash);
  return hash;
}

#max_by_keyObject



53
# File 'lib/rmtools/enumerable/hash.rb', line 53

def max_by_key; [(m = keys.max), self[m]] end

#max_by_valueObject



57
# File 'lib/rmtools/enumerable/hash.rb', line 57

def max_by_value; [(m = values.max), self[m]] end

#min_by_keyObject



55
# File 'lib/rmtools/enumerable/hash.rb', line 55

def min_by_key; [(m = keys.min), self[m]] end

#min_by_valueObject



59
# File 'lib/rmtools/enumerable/hash.rb', line 59

def min_by_value; [(m = values.min), self[m]] end

#present(inspect_string = nil) ⇒ Object



51
52
53
54
55
56
57
58
59
# File 'lib/rmtools/dev/present.rb', line 51

def present(inspect_string=nil)
  str = "{ "
  sorted = sort rescue to_a.sort_by_to_s
  str << sorted.map {|k,v|
    "#{RMTools::Painter.w((k.is String and !inspect_string) ? k : k.inspect)} => #{(v.is String and !inspect_string) ? v : v.inspect},"
  }*"\n  "
  str << "}"
  puts str
end

#to_traversableObject



10
11
12
# File 'lib/rmtools/enumerable/hash.rb', line 10

def to_traversable
  RMTools::KeyValueTraversable.new(self)
end

#truth_mapObject



73
74
75
# File 'lib/rmtools/enumerable/hash.rb', line 73

def truth_map
  map_values {|v| !!v}
end

#typeObject

Redefine since these methods are deprecated anyway



29
30
31
32
# File 'lib/rmtools/core/js.rb', line 29

def type
  a = self[:type]
  (a == default) ? self['type'] : a
end

#unify_keysObject



19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/rmtools/enumerable/hash.rb', line 19

def unify_keys
  keys.each {|k|
    case k
    when String
      sk = k.to_sym
      self[sk] = self[k] if !self[sk]
    when Symbol, Numeric
      sk = k.to_s
      self[sk] = self[k] if !self[sk]
    end
  }
  self
end