标签:实参 特征 adf 处理 全局 UNC 保护 expr 信息
dofile
函数是一种内置的操作,用于运行 lua 代码块
dofile
仅是做了 loadfile
的辅助工作
loadfile
会从一个文件加载 lua 代码块
但不会运行代码,只是编译代码
然后将编译结果作为一个函数返回
dofile
会引发错误
loadfile
只会抛出错误值,但不处理错误
function dofile(filename)
-- assert 返回错误值
local f = assert(loadfile(filename))
return f()
end
loadfile
会返回 nil
及错误消息,可自定义错误消息loadfile
,多次调用它的返回结果,也就是那个函数即可dofile
开销则相比 loadfile
大得多,因为 loadfile
只编译一次文件loadstring
时都会编译一次function
的写法只在编译对于程序块时被编译了一次i = 0
f = loadstring("i = i + 1") -- 等效于 f = function() i = i + 1 end
f()
print(i) -- 1
f()
print(i) -- 2
-- dostring 完成加载并运行代码
assert(loadstring(s))() -- 语法错误 "attempt to call a nil value"
loadstring
编译时不涉及词法域loadsting
只在全局环境中编译字符串,而非局部环境i = 32
local i = 0
f = loadstring("i = i + 1; print(i)")
g = function() i = i + 1; print(i) end
f() -- 33 使用了全局变量
g() -- 1 使用了局部变量
do
print("enter you expression:")
local l = io.read()
local func = assert(loadstring("return ‘" .. l .. "‘"))
print("the value of your expression is " .. func())
end
do
print("enter function to be plotted(with variable ‘x‘):")
local l = io.read()
local f = assert(loadstring("return " .. l))
for i = 1, 20 do
x = i
print(x .. ":" .. string.rep("*", f()))
end
end
loadfile
和 loadstring
,有一个真正的原始函数 load
loadfile
和 loadstring
分别从文件和字符串中读取程序块
load
接收一个「读取器函数」,并在内部调用它来获取程序块
读取器函数可以分几次返回一个程序块,load
会反复调用它,直到它返回 nil
(表示程序块结束)为止
只有当程序块不在文件中,或者程序块过大而无法放入内存时,才会用到 load
lua 将所有独立的程序块视为一个匿名函数的函数体,并且该匿名函数还具有可变长实参
与其他函数一样,程序块中可以声明局部变量
loadstring("a = 1") -- 等效于 function(...) a = 1 end
f = loadstring("local a = 10; print(a + 10)")
f() -- 20
print("enter function to be plotted (with variable ‘x‘):")
local l = io.read()
local f = assert(loadstring("local x = ...; return " .. l))
for i = 1, 20 do
print(string.rep("*", f(i)))
end
load
会返回 nil
以及一条错误信息print(loadstring("a a"))
-- nil [string "a a":1 ‘=‘ expected nead ‘a‘]
loadfile
和 loadstring
不会带来任何副作用-- 编写一个 lua 文件,命名为 foo
function foo(x)
print(x)
end
-- 在 cmd 中的 lua 解释器中输入
f = loadfile("你存放 foo 文件的路径")
print(foo()) -- nil
f() -- 定义函数
foo("test") -- test
标签:实参 特征 adf 处理 全局 UNC 保护 expr 信息
原文地址:https://www.cnblogs.com/door-leaf/p/13215367.html