Class: Rufus::Lua::Table
- Includes:
- Enumerable
- Defined in:
- lib/rufus/lua/objects.rb
Overview
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).
Constant Summary
Constants included from StateMixin
StateMixin::LUA_ENVIRONINDEX, StateMixin::LUA_GCCOLLECT, StateMixin::LUA_GCCOUNT, StateMixin::LUA_GCCOUNTB, StateMixin::LUA_GCRESTART, StateMixin::LUA_GCSETPAUSE, StateMixin::LUA_GCSETSTEPMUL, StateMixin::LUA_GCSTEP, StateMixin::LUA_GCSTOP, StateMixin::LUA_GLOBALSINDEX, StateMixin::LUA_MULTRET, StateMixin::LUA_NOREF, StateMixin::LUA_REFNIL, StateMixin::LUA_REGISTRYINDEX, StateMixin::SIMPLE_TYPES, StateMixin::TBOOLEAN, StateMixin::TFUNCTION, StateMixin::TLIGHTUSERDATA, StateMixin::TNIL, StateMixin::TNONE, StateMixin::TNUMBER, StateMixin::TSTRING, StateMixin::TTABLE, StateMixin::TTHREAD, StateMixin::TUSERDATA
Instance Attribute Summary
Attributes inherited from Ref
Instance Method Summary collapse
-
#[](k) ⇒ Object
Returns the value behind the key, or else nil.
-
#[]=(k, v) ⇒ Object
Sets a value in the table.
-
#each ⇒ Object
The classical ‘each’.
-
#keys ⇒ Object
Returns the array of keys of this Table.
-
#objlen ⇒ Object
Returns the size of the table, corresponds to the Lua ‘#’ operator.
-
#size ⇒ Object
(also: #length)
Returns the real size of the table (number of entries + number of elements in array side).
-
#to_a(pure = true) ⇒ Object
Returns a Ruby Array instance representing this Lua table.
-
#to_h ⇒ Object
Returns a Ruby Hash instance representing this Lua table.
-
#to_ruby ⇒ Object
Turns the Lua table into a Ruby array, or else into a Ruby Hash instance.
-
#values ⇒ Object
Returns the array of values in this Table.
Methods inherited from Ref
Constructor Details
This class inherits a constructor from Rufus::Lua::Ref
Instance Method Details
#[](k) ⇒ Object
Returns the value behind the key, or else nil.
154 155 156 157 158 159 160 |
# 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) ⇒ Object
Sets a value in the table
TODO : have something for adding in the array part…
166 167 168 169 170 171 172 173 174 175 |
# 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 ⇒ Object
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).
132 133 134 135 136 |
# 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 ⇒ Object
Returns the array of keys of this Table.
140 141 142 143 |
# File 'lib/rufus/lua/objects.rb', line 140 def keys self.to_h.keys end |
#objlen ⇒ Object
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.
182 183 184 185 186 |
# File 'lib/rufus/lua/objects.rb', line 182 def objlen load_onto_stack Lib.lua_objlen(@pointer, -1) end |
#size ⇒ Object Also known as: length
Returns the real size of the table (number of entries + number of elements in array side)
191 192 193 194 |
# File 'lib/rufus/lua/objects.rb', line 191 def size self.to_h.size end |
#to_a(pure = true) ⇒ Object
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"]]
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 |
# 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 ⇒ Object
Returns a Ruby Hash instance representing this Lua table.
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 |
# 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 ⇒ Object
Turns the Lua table into a Ruby array, or else into a Ruby Hash instance.
279 280 281 282 |
# File 'lib/rufus/lua/objects.rb', line 279 def to_ruby to_a rescue to_h end |
#values ⇒ Object
Returns the array of values in this Table.
147 148 149 150 |
# File 'lib/rufus/lua/objects.rb', line 147 def values self.to_h.values end |