Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.
You are using an out of date browser. It may not display this or other websites correctly. You should upgrade or use an alternative browser.
HBGames
Here's a litte addition to the module I have made ^^
Code:
class Module
def attr_sec_accessor(sym, *args, &block)
if block.nil? # default actions
args = [0] if args.size == 0 #default = 0
if args.size < 2 # One pair
attr_writer sym
attr_sec_reader sym, *args
else # loads of methods followed by a default value.
default = args[-1]
syms = [sym].concat(args)
syms.pop
for sym in syms
attr_writer sym
attr_sec_reader sym, default
end
end
else # when a block is given
# currently just pair sematics
args.unshift(sym)
i = 0
while i < args.size
attr_writer args[i]
attr_sec_reader args[i], args[i+1]
i += 2
end
end
end
def attr_sec_reader(sym, default = 0)
sym = sym.id2name
string = "def #{sym};" +
" @#{sym} = #{default} if @#{sym}.nil?;" +
" @#{sym};" +
"end;"
module_eval(string)
end
end
Code:
class Module
def attr_sec_accessor(sym, default = 0)
attr_writer sym
attr_sec_reader sym, default
end
def attr_sec_reader(sym, default = 0)
sym = sym.id2name
string = "def #{sym};" +
" @#{sym} = #{default} if @#{sym}.nil?;" +
" @#{sym};" +
"end;"
module_eval(string)
end
end
You can use it like this:
Code:
attr_sec_accessor :method, default
It works pretty much like the attr_accessor except that you can only do method creation per call. method is the method name. default is the default value the method returns. (If it has not been written to yet.)
An usage example:
Code:
class Foo
attr_sec_accessor :visible, false
attr_sec_accessor :data, 'Data_Foo.new'
end
This way you'll have that the default variable of visible is false.
If it is called before you write to the variable you will get 'false' rather than 'nil'
One thing to note is that lazy instantiation is used.
Let us assume that Data_Foo is a heavy object. It is only created if you try to read what the data attribute contains before you have written to it. More specifically. If the value of data attribute is nil then it is change to be what the default value is.
The code in the example is converted to this:
Code:
class Foo
def visible=(value)
@visible = value
end
def visible
@visible = false if @visible.nil?
@visible
end
def data=(value)
@data = value
end
def data
@data = Data_Foo.new if @data.nil?
@data
end
end
One thing to notice is that you must put '' around Data_Foo.new to make it a string. Otherwise you will get an error in almost all cases.
The greatest use will probably be if you want to add information to hidden classes. Let's for an example take RPG::Actor.
You can use its initialize method to set the default value by default because it won't be called automatically.
Other than that it will hopefully make the coder shorter and easier to understand.
Naturally. Only use this functionality where it is needed or where it can have a positive use ^_^