Class: Rufus::Lua::Table

Inherits:
Ref
  • Object
show all
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

#ref

Instance Method Summary collapse

Methods inherited from Ref

#free, #initialize

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

#eachObject

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

#keysObject

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

#objlenObject

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

#sizeObject 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_hObject

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_rubyObject

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

#valuesObject

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