class Rufus::Lua::Table

A Lua table.

For now, the only thing you can do with it is cast it into a Hash or an Array (will raise an exception if casting to an Array is not possible).

Note that direct manipulation of the Lua table (inside Lua) is not possible (as of now).

Public Instance Methods

[](k) click to toggle source

Returns the value behind the key, or else nil.

# File lib/rufus/lua/objects.rb, line 154
def [](k)

  load_onto_stack # table
  stack_push(k) # key
  Lib.lua_gettable(@pointer, -2) # fetch val for key at top and table at -2
  stack_pop
end
[]=(k, v) click to toggle source

Sets a value in the table

TODO : have something for adding in the array part…

# File lib/rufus/lua/objects.rb, line 166
def []=(k, v)

  load_onto_stack

  stack_push(k)
  stack_push(v)
  Lib.lua_settable(@pointer, -3)

  v
end
each() { |k, v| ... } click to toggle source

The classical 'each'.

Note it cheats by first turning the table into a Ruby Hash and calling the each of that Hash instance (this way, the stack isn't involved in the iteration).

# File lib/rufus/lua/objects.rb, line 132
def each

  return unless block_given?
  self.to_h.each { |k, v| yield(k, v) }
end
keys() click to toggle source

Returns the array of keys of this Table.

# File lib/rufus/lua/objects.rb, line 140
def keys

  self.to_h.keys
end
length()
Alias for: size
objlen() click to toggle source

Returns the size of the table, corresponds to the Lua '#' operator.

Will thus return 0 if the table doesn't hold any value in its 'array' part.

# File lib/rufus/lua/objects.rb, line 182
def objlen

  load_onto_stack
  Lib.lua_objlen(@pointer, -1)
end
size() click to toggle source

Returns the real size of the table (number of entries + number of elements in array side)

# File lib/rufus/lua/objects.rb, line 191
def size

  self.to_h.size
end
Also aliased as: length
to_a(pure=true) click to toggle source

Returns a Ruby Array instance representing this Lua table.

Will raise an error if the 'rendering' is not possible.

s = Rufus::Lua::State.new

@s.eval("return { a = 'A', b = 'B', c = 3 }").to_a
  # => error !

@s.eval("return { 1, 2 }").to_a
  # => [ 1.0, 2.0 ]

@s.eval("return {}").to_a
  # => []

@s.eval("return { 1, 2, car = 'benz' }").to_a
  # => error !

to_a(false)

Setting the optional argument 'pure' to false will manage any table :

s = Rufus::Lua::State.new

@s.eval("return { a = 'A', b = 'B', c = 3 }").to_a(false)
  # => [["a", "A"], ["b", "B"], ["c", 3.0]]

@s.eval("return { 1, 2 }").to_a(false)
  # => [1.0, 2.0]

@s.eval("return {}").to_a(false)
  # => []

@s.eval("return { 1, 2, car = 'benz' }").to_a(false)
  # => [1.0, 2.0, ["car", "benz"]]
# File lib/rufus/lua/objects.rb, line 261
def to_a(pure=true)

  h = self.to_h

  pure && h.keys.find { |k| not [ Float ].include?(k.class) } &&
    fail('cannot turn hash into array, some keys are not numbers')

  a_keys = (1..objlen).to_a.collect { |k| k.to_f }
  keys = a_keys + (h.keys - a_keys)

  keys.inject([]) { |a, k|
    a << (a_keys.include?(k) ? h[k] : [ k, h[k] ])
    a
  }
end
to_h() click to toggle source

Returns a Ruby Hash instance representing this Lua table.

# File lib/rufus/lua/objects.rb, line 199
def to_h

  load_onto_stack

  table_pos = stack_top

  Lib.lua_pushnil(@pointer)

  h = {}

  while Lib.lua_next(@pointer, table_pos) != 0 do

    value = stack_fetch(-1)
    value.load_onto_stack if value.is_a?(Ref)

    key = stack_fetch(-2)
    key.load_onto_stack if key.is_a?(Ref)

    stack_unstack # leave key on top

    h[key] = value
  end

  h
end
to_ruby() click to toggle source

Turns the Lua table into a Ruby array, or else into a Ruby Hash instance.

# File lib/rufus/lua/objects.rb, line 279
def to_ruby

  to_a rescue to_h
end
values() click to toggle source

Returns the array of values in this Table.

# File lib/rufus/lua/objects.rb, line 147
def values

  self.to_h.values
end