我对表达很好奇flip id(这不是作业:我在getOpt文档中找到了它).
我想知道它为什么有这种类型:
Prelude> :t (flip id)
(flip id) :: b -> (b -> c) -> c
Run Code Online (Sandbox Code Playgroud)
例如,(flip id) 5 (+6)给出11.
我知道为什么id (+6) 5给11,但我不"得到"的flip id东西.
我试图用笔和纸来解决这个问题但不能.有人可以向我解释一下吗?我的意思是,怎么样flip id的类型b -> (b -> c) -> c?
我必须执行以下代码:
local filename = dir .. "/" .. base
Run Code Online (Sandbox Code Playgroud)
循环中数千次(这是一个打印目录树的递归).
现在,我想知道Lua是否一次性连接3个字符串(dir,"/",base)(即通过分配足够长的字符串来保存它们的总长度),或者它是否通过在内部执行它来实现这种效率低下的方式两个步骤:
local filename = (dir .. "/") -- step1
.. base -- step2
Run Code Online (Sandbox Code Playgroud)
最后一种方式是内存方式效率低下,因为分配了两个字符串而不是一个字符串.
我不太关心CPU周期:我主要关心内存消耗.
最后,让我概括一下这个问题:
Lua在执行以下代码时是否只分配一个字符串或4?
local result = str1 .. str2 .. str3 .. str4 .. str5
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我知道我能做到:
local filename = string.format("%s/%s", dir, base)
Run Code Online (Sandbox Code Playgroud)
但我还没有对它进行基准测试(内存和CPU方面).
(顺便说一句,我知道table:concat().这会增加创建表的开销,所以我猜它在所有用例中都不会有用.)
奖金问题:
如果Lua没有优化".."运算符,那么定义用于连接字符串的C函数是否是一个好主意,例如utils.concat(dir, "/", base, ".", extension)?
当我做:
puts(nil or 4)
Run Code Online (Sandbox Code Playgroud)
Ruby抱怨:
SyntaxError: syntax error, unexpected keyword_or, expecting ')'
Run Code Online (Sandbox Code Playgroud)
这是为什么?puts(nil || 4)确实有效,但我想知道为什么or不这样做.我认为两者之间的区别只在于它们的运算符优先级.
(我知道这个表达nil or 4似乎没有用,因为它总是会返回4.这只是一个例子,为了简单起见.我的实际表达是Integer(ENV['WD'] or 4).)
我曾经遇到过几个 地方,人们称之为collectgarbage() 两次来完成所有未使用的对象.
这是为什么?为什么单个电话不够?为什么不打三个电话?
当我尝试下面的代码(在Lua 5.2上)时,__gc只需一次调用就可以最终确定对象(意思是:它被调用)collectgarbage:
do
local x = setmetatable({},{
__gc = function() print("works") end
})
end
collectgarbage()
os.exit()
Run Code Online (Sandbox Code Playgroud)
这是否意味着一个电话就足够了?
我有一个正则表达式给我一个结果,sed但在Perl(和Ruby)中有另一个结果.
我有字符串one;two;;three,我想突出显示由;.分隔的子字符串.所以我在Perl中执行以下操作:
$a = "one;two;;three";
$a =~ s/([^;]*)/[\1]/g;
print $a;
Run Code Online (Sandbox Code Playgroud)
(或者,在Ruby中:print "one;two;;three".gsub(/([^;]*)/, "[\\1]").)
结果是:
[one][];[two][];[];[three][]
Run Code Online (Sandbox Code Playgroud)
(我知道虚假空子串的原因.)
奇怪的是,当我运行相同的正则表达式时,sed我得到了不同的结果.我跑:
echo "one;two;;three" | sed -e 's/[^;]*/[\0]/g'
Run Code Online (Sandbox Code Playgroud)
我得到:
[one];[two];[];[three]
Run Code Online (Sandbox Code Playgroud)
造成这种不同结果的原因是什么?
编辑:
有人回答"因为sed不是perl".我知道.我问我的问题的原因是因为我不明白如何sed应对零长度匹配.
一些Lua函数返回nil以通知用户该函数不能执行某些任务(例如tonumber(),string.find()).
在C中,returnig nil就是这样完成的:
int some_function(lua_State* L) {
...
if (some condition) {
lua_pushnil(L);
return 1;
}
...
}
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否可以做以下事情:
int some_function(lua_State* L) {
...
if (some condition) {
return 0;
}
...
}
Run Code Online (Sandbox Code Playgroud)
它更短.我尝试了它似乎有效,但我不知道这是否是按设计的.我检查了Lua的源代码,我没有看到这种return 0模式,所以我想知道这样做是否合法.
两种不同的返回方式是否nil相同?
(顺便说一句,我知道所有关于通过异常发出的信号错误(也就是说),lua_error()所以请不要提及它.)
更新:
我现在看到两种方法之间存在细微的差别:print((function() end)())没有打印,而是print((function() return nil end)())打印"nil".我不知道这有多重要.
这里有一些讨论和实用函数,用于分割字符串,但是我需要一个特殊的单行程来完成一个非常简单的任务.
我有以下字符串:
local s = "one;two;;four"
Run Code Online (Sandbox Code Playgroud)
我想分开它";".我想最终得到{ "one", "two", "", "four" }回报.
所以我试着这样做:
local s = "one;two;;four"
local words = {}
for w in s:gmatch("([^;]*)") do table.insert(words, w) end
Run Code Online (Sandbox Code Playgroud)
但结果(words表)是{ "one", "", "two", "", "", "four", "" }.那肯定不是我想要的.
现在,正如我所说,这里有一些关于分裂字符串的讨论,但它们中有"冗长"的功能,我需要一些简洁的东西.我需要这个代码用于一个程序,在那里我展示了Lua的优点,如果我添加一个冗长的函数来做一些如此微不足道的事情,它将违背我.
今天我看到了以下代码:
Prelude> [a | Just a <- [Just 10, Nothing, Just 20]]
[10, 20]
Run Code Online (Sandbox Code Playgroud)
有用.但我认为上面的列表理解只是...的语法糖
[Just 10, Nothing, Just 20] >>= (\(Just x) -> return x)
Run Code Online (Sandbox Code Playgroud)
... Haskell在遇到时Nothing会发出错误*** Exception: Non-exhaustive patterns in lambda.
所以我的问题是:什么[a | Just a <- [Just 10, Nothing, Just 20]]转化为(在monadic代码方面)使它忽略了Nothing?
的瓦拉教程提到以下方法和属性(和运营商)内置阵列:
arr.length
arr += element
arr.resize()
arr.move()
Run Code Online (Sandbox Code Playgroud)
(我所说的“内置数组”是指类似于int[] arr = new int[5]GLib 或 Gee 提供的花哨数据结构。)
我的问题:这样的数组是否支持更多的方法和属性?这是在哪里记录的?