Why doesn't this function work?

Yes, me again. Don’t worry though, this is probably a stupid problem that will be easy to solve. I have a function that should help with creating a lot of buttons on a vgui, but I have a problem, when I try to print the vgui button that should have been created by this function, it keeps returning ‘nil’. I simplified the code quite a lot, and I’m pretty horrible at localizing, so the problem probably lies around something like that.



local function ButtonCreate(buttonname, buttonsize, buttontext, extraargs)
	local buttonname = self.list:Add( "DButton" )
	buttonname:SetSize( buttonsize, 70 )
	buttonname:SetText( buttontext )
	extraargs()
	return buttonname
end

ButtonCreate(buttontest, 200, "Make the victim say something!", function()
print(buttontest)
end)


I’m sure it’s something obvious I missed.

[editline]30th March 2015[/editline]

By the way, I left out self.list from the example, as it shouldn’t matter.

Firstly, you are asking for an argument that you overwrite in the first line. Secondly, you pass a nil argument (Buttontest is undefined) to the function. Thirdly, same thing for print. Fourthly, you don’t have access to a the self variable in this instance. Only when you are defining a function like this do you have access to it:

[lua]function Meta:Func() end [/lua]

In Lua, you can’t pass references like in C++. What you want to achieve is done like this:

[lua]
local function ButtonCreate(buttonname, buttonsize, buttontext, extraargs)
_G[buttonname] = self.list:Add( “DButton” )
_G[buttonname]:SetSize( buttonsize, 70 )
_G[buttonname]:SetText( buttontext )
extraargs()
return _G[buttonname] – No idea why you are returning it but sure.
end

ButtonCreate(“buttontest”, 200, “Make the victim say something!”, function()
print(buttontest)
end)
[/lua]

I want the button to be local though (to the code calling the function), and _G means global, right? Or, just global to the code calling it (if that makes sense)?

That makes sense, the way you formulating your code made be think you wanted them global. For local instances, you would do it like this:

[Lua]
local function ButtonCreate( buttonsize, buttontext, extraargs)
local buttonname = self.list:Add( “DButton” )
buttonname:SetSize( buttonsize, 70 )
buttonname:SetText( buttontext )
extraargs()
return buttonname
end

local buttontest = ButtonCreate(200, “Make the victim say something!”, function()
print(buttontest)
end)

[/lua]

Note that this’ll still print nil because buttontest hasn’t been assigned when extraargs() is run.

You should probably do this:
[lua]
local function ButtonCreate( buttonsize, buttontext, extraargs)
local buttonname = self.list:Add( “DButton” )
buttonname:SetSize( buttonsize, 70 )
buttonname:SetText( buttontext )
extraargs()
return buttonname
end

local buttontest = ButtonCreate(200, “Make the victim say something!”)
print(buttontest)
[/lua]

If, however, you desperately want to manipulate it in a callback, you can pass it as an argument.

[lua]
local function ButtonCreate( buttonsize, buttontext, extraargs)
local buttonname = self.list:Add( “DButton” )
buttonname:SetSize( buttonsize, 70 )
buttonname:SetText( buttontext )
extraargs( buttonname )
return buttonname
end

local buttontest = ButtonCreate(200, “Make the victim say something!”, function(buttontest)
print(buttontest)
end)
[/lua]

@Lixquid Yep, I desperately wanted to manipulate it! Thanks a LOT!