写了多年程序,突然想知道为什么函数可以连着用啊

2018-09-12 11:56:54 +08:00
 pinews
就是 a(b(c()))这样,虽然经常这样用,总觉得怪怪的,不知道在哪里是否有专门的说明?
15402 次点击
所在节点    PHP
148 条回复
arthas2234
2018-09-12 18:27:35 +08:00
基础知识不过关啊。。。会去好好学吧
laqow
2018-09-12 18:33:16 +08:00
看一下 LISP 语言就会觉得不这么写都不正常
RingoTC
2018-09-12 18:36:13 +08:00
函数的函数鸭
bucky
2018-09-12 18:38:05 +08:00
这和函数式有什么关系?函数返回值不用变量直接直接传入另一个函数和需要函数式支持?
RainyH2O
2018-09-12 18:50:02 +08:00
第一次看到过程 VS 对象 VS 函数打的这么激烈的
你们是要给这种调用形式争夺唯一代表权么
xlui
2018-09-12 19:20:43 +08:00
t.c:
int a() {return 1;}
int b(int i) {return i+1;}
int c(int i) {return i+1;}
int main() { c(b(a())); }

gcc -S t.c -o a.s
cat a.s:
...
main:
...
movl $0, %eax
call a
movl %eax, %edi
call b
movl %eax, %edi
call c
realpg
2018-09-12 19:24:20 +08:00
@CODEWEA #77
……你怕是对匿名函数有什么误解
MineDog
2018-09-12 19:30:58 +08:00
47 楼,别黑我 java,这算什么函数式编程,只是方法的返回值作为参数而已,算一个语法糖吧
lichao
2018-09-12 19:43:38 +08:00
c() |> b() |> a()
luopengfei14
2018-09-12 19:44:59 +08:00
@xlui 大佬
mmdsun
2018-09-12 19:50:09 +08:00
楼主问的是函数调用栈帧原理吧
reus
2018-09-12 21:06:49 +08:00
就一个表达式求值,关函数式、柯里化、调用栈什么事?这里根本就没有出现高阶函数

f(xxx, ...) 这是函数调用表达式,传入的参数可以是其他表达式,也就是可以传入另一个函数调用表达式,同理可以嵌套多层。a(b(c())) 就是嵌套了多层的函数调用表达式。

水平真低。
yichinzhu
2018-09-12 22:12:18 +08:00
在 v2 学到了很多黑 PHP 的姿势😑
zagreb
2018-09-12 22:38:43 +08:00
看了附言 1:
“不知道基础知识哪里学”,表达式,函数表达式和函数返回值了解一下。函数参数没说一定要变量,表达式就行。
“ md5(...)”,你想表达的是不是 md5(max(a,b))?
qiayue
2018-09-12 22:40:26 +08:00
a(b(c())) 等价于下面三行
$cResult = c( );
$bResult = b( $cResult );
$aResult = c( $bResult );

举一个真实例子,get 获取到的数据,先 url decode 之后,再 base64 解码,再 json decode 成数组
$userUrlEncode = $_GET['user'];
$userBase64 = urldecode( $userUrlEncode );//传入字符串,返回字符串
$userJson = base64_decode( $userBase64 );//传入字符串,返回字符串
$user = json_decode( $userJson );////传入字符串,返回数组
以上串起来写就是
$user = json_decode(base64_decode(urldecode( $_GET['user'] )));

记住,传进去的并不是函数,而是函数返回的结果
qiayue
2018-09-12 22:41:14 +08:00
$aResult = c( $bResult );
勘误,正确为:
$aResult = a( $bResult );
qiayue
2018-09-12 22:42:46 +08:00
$user = json_decode( $userJson );////传入字符串,返回数组
勘误,正确为:
$userArr = json_decode( $userJson, TRUE );////传入字符串,返回数组
或者
$userObj = json_decode( $userJson );////传入字符串,返回对象
zmj1316
2018-09-12 22:48:03 +08:00
我刚看到以为是问 C++ 左值右值呢......
deljuven
2018-09-12 22:56:36 +08:00
1L 的说法是正确的,基本就是计算机语言理论那一套东西,参看 Wikipedia: https://en.wikipedia.org/wiki/Currying
pinews
2018-09-12 23:07:13 +08:00
@zagreb 感谢,表达式章节的确说了函数也是表达式,只不过在运算符优先级里面提到了 new clone [等运算符,那么按说执行函数其实也是运算符了,和赋值运算符=一样自右至左参与运算。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/488475

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX