写入PL/pgSQL或SQL可定义为的函数RETURNS void.我最近偶然发现了结果的奇怪差异.
请考虑以下演示:
CREATE OR REPLACE FUNCTION f_sql()
RETURNS void AS
'SELECT NULL::void' -- "do nothing", no special meaning
LANGUAGE sql;
CREATE OR REPLACE FUNCTION f_plpgsql()
RETURNS void AS
$$
BEGIN
NULL; -- "do nothing", no special meaning
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
该函数f_sql()使用唯一可能的方法SELECT(在SQL函数中作为最后一个命令)RETURNS void.我使用它只是因为它是用于此测试目的的最简单方法 - 任何其他函数,例如,UPDATE或者DELETE显示相同的行为.
现在,void是一种虚构的类型.虽然plpgsql功能似乎返回一个空字符串类型相当于void有效,''::void.该sql功能似乎回归NULL::void.
db=# SELECT f_sql() IS NULL; …Run Code Online (Sandbox Code Playgroud) 可能重复:
Java Void引用类型的用途?
Void现实世界中问题的真正用法是什么?在哪种情况下我们可以使用这个类?
我尝试在Kotlin中创建函数而不返回值.我编写了一个类似于Java的函数,但使用了Kotlin语法
fun hello(name: String): Void {
println("Hello $name");
}
Run Code Online (Sandbox Code Playgroud)
我有一个错误
错误:带有块体('{...}')的函数中需要'return'表达式
经过几次修改后,我得到了具有可空Void作为返回类型的工作函数.但这并不是我所需要的
fun hello(name: String): Void? {
println("Hello $name");
return null
}
Run Code Online (Sandbox Code Playgroud)
根据Kotlin文档,单元类型对应于Java中的void类型.所以在Kotlin中没有返回值的正确函数是
fun hello(name: String): Unit {
println("Hello $name");
}
Run Code Online (Sandbox Code Playgroud)
要么
fun hello(name: String) {
println("Hello $name");
}
Run Code Online (Sandbox Code Playgroud)
问题是:Void在Kotlin 中意味着什么,如何使用它以及这种用法的优点是什么?
来自OO(C#,Java,Scala),我非常重视代码重用和类型安全的原则.上述语言中的类型参数可以完成这项工作并启用通用数据结构,这些结构既是类型安全的,也不会"浪费"代码.
当我陷入C时,我意识到我必须做出妥协,我希望它是正确的.我的数据结构void *在每个节点/元素中都有一个,我失去了类型安全性,或者我必须为我想要使用它们的每种类型重新编写我的结构和代码.
代码的复杂性是一个显而易见的因素:遍历数组或链接列表是微不足道的,并且添加*next一个结构不是额外的努力; 在这些情况下,不尝试重用结构和代码是有道理的.但对于更复杂的结构,答案并不那么明显.
还有模块化和可测试性:将类型及其操作与使用该结构的代码分离,使测试更容易.反之亦然:在一个结构上测试某些代码的迭代,同时它试图做其他事情变得混乱.
那么你的建议是什么?void *和重用或类型安全和重复的代码?有没有一般原则?当我不适合时,我是否试图强迫OO进行程序化?
编辑:请不要推荐C++,我的问题是关于C!
所以,我在这里找到了一个类似的问题,但答案更多的是关于风格以及你是否能够做到这一点.
我的问题是,当你调用一个返回一个对象的非void函数时,实际发生了什么,但是你从不分配或使用所述返回的对象?所以,更少关于你是否可以,因为我完全知道你可以理解上面链接的另一个问题......编译器/运行时环境有什么作用?
这不是特定于语言的问题,但如果您回答,请说明您所指的语言,因为行为会有所不同.
我正在使用C语言并修改以前由其他人编写的代码.我正在努力解决一些问题,而且我正在努力尽可能多地了解正在发生的事情.所以,正如我的问题所说,创建函数static inline void和void创建函数之间有什么区别?我为这篇长篇文章提前道歉,但我想让你知道我做了一些研究,但不明白我发现了什么.
静态说明符表示无法从其他文件引用该函数; 也就是说,链接器不会导出名称.
通过阅读本文,我假设引用一个函数与调用函数不同?我假设因为这个函数是从另一个.c文件调用的.如果是这种情况,那么什么是引用函数?
通过同一个网站,他们解释内联功能,我不明白它的含义.
__inline关键字告诉编译器将函数定义中的代码替换为函数调用的每个实例.但是,替换仅在编译器自行决定时发生.例如,如果函数的地址被采用或者它太大而不能内联,则编译器不会内联函数.
咦???
非常感谢任何帮助,我再次为这篇非常长的帖子道歉.
以下位于file1.c(使用通用名称,因为我觉得不重要)
COMPLEX cNoiseSample;
CGauss( &cNoiseSample, loopbackRadio->pState );
Run Code Online (Sandbox Code Playgroud)
以下文件位于file2.c中
static inline void CGauss( COMPLEX * pcGauss, P_OS_UNIFORM_RAND_STATE pState )
{
//code
}
Run Code Online (Sandbox Code Playgroud) 究竟是什么区别Void,void和我可以只使用null呢?
我问这是因为我正在查看示例Android代码,他们使用Void但是它上面有Eclipse错误(它说Void cannot be resolved to a variable).
我破解的代码是
public class MyAsyncTask extends AsyncTask<Void, Void, Boolean>{
...
}
Run Code Online (Sandbox Code Playgroud)
我这样用它
MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute((Void),null);//this is the line that breaks "Void cannot be resolved to a variable"
Run Code Online (Sandbox Code Playgroud) 我正在使用 Jest 和 Typescript。我有一个不返回任何内容的异步函数(void)。我如何模拟返回 void?我尝试了下面的
const myMockFn = jest.fn().mockImplementationOnce(() => Promise.resolve(void));
jest.mock('../config', () => ({
setup: async () =>
myMockFn(),
}));
Run Code Online (Sandbox Code Playgroud)
但我收到编译错误
Expression expected.
Run Code Online (Sandbox Code Playgroud)
与“Promise.resolve(void)”相关。
请考虑以下事项main():
int main(int argc, char *argv[])
{
return (0);
}
Run Code Online (Sandbox Code Playgroud)
在编译时cc -Wall -Wextra,会生成警告"未使用的参数".
当我不需要在函数中使用参数时(例如在不使用其参数的信号处理函数中int),我习惯于执行以下操作:
int main(int argc, char *argv[])
{
(void)argc;
(void)argv;
return (0);
}
Run Code Online (Sandbox Code Playgroud)
(对于特定的
main(),我有时看到别人做的:argv = argv - argc + argc)
但是,是什么(void)var真正办?
我明白这(void)是一个演员,所以我想我正在抛弃变量?什么是var;线(不投)呢?这是一个空任务,一个空表达式?
我想了解实际发生了什么.