Self parameter
Self parameter
Hello friends.
In my learning curve in programming i´m trying to do some OOP. I understand concepts like objects, classes etc etc but I can´t understand the "self" concept used in objects.
I know it´s a generic question that i could try to resolve out there but I have tried Googleing and cant understand.
Thanks people!
In my learning curve in programming i´m trying to do some OOP. I understand concepts like objects, classes etc etc but I can´t understand the "self" concept used in objects.
I know it´s a generic question that i could try to resolve out there but I have tried Googleing and cant understand.
Thanks people!
Re: Self parameter
Self parameter is just a variable that Hollywood automatically passes to a table's method and it is a reference to that table.
Instead of a self, you could directly use table's name instead.
Lets take a simple Point class for an example
Interesting part is at the new method. Can you figure how it works? It gives default values and all Point table's methods available to a new table.
Example Usage:
Instead of a self, you could directly use table's name instead.
Lets take a simple Point class for an example
Code: Select all
; Point "class"
Point = { x = 0, y = 0 }
; Methods for point "class"
Function Point:new(p)
p = p Or {}
SetMetaTable(p, self)
self.__index = self
Return(p)
EndFunction
Function Point:add(p)
Local pp = Point:new( { x = self.x, y = self.y } )
pp.x = pp.x + p.x
pp.y = pp.y + p.y
Return(pp)
EndFunction
Function Point:sub(p)
Local pp = Point:new( { x = self.x, y = self.y } )
pp.x = pp.x - p.x
pp.y = pp.y - p.y
Return(pp)
EndFunction
Function Point:mul(number)
Local pp = Point:new( { x = self.x, y = self.y } )
pp.x = pp.x * number
pp.y = pp.y * number
Return(pp)
EndFunction
Function Point:div(number)
Local pp = Point:new( { x = self.x, y = self.y } )
pp.x = pp.x / number
pp.y = pp.y / number
Return(pp)
EndFunction
Function Point:eq(p)
If self.x = p.x And self.y = p.y Then Return(True) Else Return(False)
EndFunction
Example Usage:
Code: Select all
p0 = Point:new() ; Create zero point
p1 = Point:new( { x = 5, y = 5 }) ; Create Point p1
p2 = Point:new( { x = 2, y = 4 }) ; Create Point p2
p3 = p1:add(p2) ; Point p3 = p1 + p2
Re: Self parameter
I need to read all again but thanks Jalih. You are always so helpful....
But, if you could directly use table's name why to use the self parameter?
Well, perhaps I have to learn more depthly the basics of oop.
Thanks!
But, if you could directly use table's name why to use the self parameter?
Well, perhaps I have to learn more depthly the basics of oop.
Thanks!
Re: Self parameter
Usually in OOP you don't directly know the name of the owner object (=table) when writing methods and would need a way to pass that information to method. Hollywood and Lua do that automatically for you by supplying a self parameter to method.tolkien wrote: But, if you could directly use table's name why to use the self parameter?
Let's take my previous Point class for an example:
Code: Select all
p1 = Point:new()Re: Self parameter
Jalih, I think I understand the concept. Methods are general to all objects and when we create a new one we need to know to what who own who.
I´ll study the NEW method you write cos it´s a bit alien to me
Thanks again Jalih, I´m going to practice.
I´ll study the NEW method you write cos it´s a bit alien to me
Thanks again Jalih, I´m going to practice.
Re: Self parameter
After some reading I understand perfectly the concept of the Self parameter. With your explaining and the book LUA PROGRAMMING I think can experiment some OOP programming during a few weeks.
Thanks again, it´s fantastic to have people like you here.
Thanks again, it´s fantastic to have people like you here.
Re: Self parameter
More about OOP plz.
How can I simulate class constructors like in C++ in hollywood?
And...Its a good idea to use copytable to copy the class and make new objets?
I get no idea.
How can I simulate class constructors like in C++ in hollywood?
And...Its a good idea to use copytable to copy the class and make new objets?
I get no idea.
Re: Self parameter
Well it's a good question because seems that around there are many way to implement oop under Lua (and Hollywood).
Using metatables to redirect instances methods calls to the parent class seems the most used implementation but to be honest after trying many solution I've choiced the simple way, so most of the time I prefer to make a copytable of the class to make my object independent. This way if at run time I change some things of the main class I'm sure that these changes will not be reflected into instantiated objects.
The bad using this implementation is that doing a copytable you copy methods too wasting memory for functions that could be declared only once in the root class. I've not tested, but I think that excluding the time needed to do the copytable the runtime should be a little faster because all methods are directly accessible in your objects.
I usually use the copytable with a function that override all object default values if the user pass them, just a little example:
TB.Set(base, override, newtable) is part of Tables library (available here) and is used to override any values in the <base> table with the one specified in the <override> table, it's fully recursive. <newtable> is a flag that specify if it must create a new table or modify the <base> directly
I think that depends of your projects and your coding style 
Using metatables to redirect instances methods calls to the parent class seems the most used implementation but to be honest after trying many solution I've choiced the simple way, so most of the time I prefer to make a copytable of the class to make my object independent. This way if at run time I change some things of the main class I'm sure that these changes will not be reflected into instantiated objects.
The bad using this implementation is that doing a copytable you copy methods too wasting memory for functions that could be declared only once in the root class. I've not tested, but I think that excluding the time needed to do the copytable the runtime should be a little faster because all methods are directly accessible in your objects.
I usually use the copytable with a function that override all object default values if the user pass them, just a little example:
Code: Select all
myClass = { x = 0, y = 0 }
Function myClass:New(parameters)
Local NewObj = CopyTable(myClass)
TB.Set(NewObj, parameters, False)
Return(NewObj)
EndFunctionCode: Select all
myClass = { x = 0, y = 0 }
Function myClass:New(parameters)
Local NewObj = CopyTable(myClass)
TB.Set(NewObj, parameters, False)
Return(NewObj)
EndFunction
myInstance1 = myClass:New({x = 100})
myInstance2 = myInstance1:New({y = 20})----------------------------
[Allanon] Fabio Falcucci | GitHub (leaving) | Gitea (my new house) | My Patreon page | ☆★ All my links ★☆
[Allanon] Fabio Falcucci | GitHub (leaving) | Gitea (my new house) | My Patreon page | ☆★ All my links ★☆
Re: Self parameter
Most of the time I prefer not using copytable and just create a table for class with a new method. In the new method, I create a local table for actual object and declare all methods directly for that local table and then return the table.Allanon wrote: I usually use the copytable with a function that override all object default values if the user pass them, just a little example:
Metatable approach was used in my previous Point class example...
Re: Self parameter
Very interesting!
Jalih, yo say more or less this?
Function new_star(x, y, color, dy)
Local object={x=x, y=y, color=color, dy=dy}
Return (object)
EndFunction
star1 = new_star(10,20, #red, 10)
Allanon, I have a question...
Why you use
Function myClass:New(parameters) for creating object instead of
Function myClass.New(parameters) ????
I understand the ":" if we use methods but I don´t understand it to create objects.
yes, I,m learning.
Jalih, yo say more or less this?
Function new_star(x, y, color, dy)
Local object={x=x, y=y, color=color, dy=dy}
Return (object)
EndFunction
star1 = new_star(10,20, #red, 10)
Allanon, I have a question...
Why you use
Function myClass:New(parameters) for creating object instead of
Function myClass.New(parameters) ????
I understand the ":" if we use methods but I don´t understand it to create objects.
yes, I,m learning.