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
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
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
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
Returns the array of keys of this Table
.
# File lib/rufus/lua/objects.rb, line 140 def keys self.to_h.keys end
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
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
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
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
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
Returns the array of values in this Table
.
# File lib/rufus/lua/objects.rb, line 147 def values self.to_h.values end