找回密码
 点一下
查看: 4713|回复: 13

[重新整理修正]constant function 和 function的区别

[复制链接]
发表于 2006-6-1 15:51:01 | 显示全部楼层 |阅读模式
关于在某函数前加constant关键字会有什么不一样。以下是我一小时测试得到的结论(我把constant function翻译成常数函数好了):

常数函数的函数体不能出现“改变全局变量”或者“调用非常数函数”的任何语句

如下函数

[jass]function abc takes nothing returns string
     set udg_s=( udg_s + udg_s2 )
     return udg_s
endfunction //合法![/jass]

是常见函数,但是若将在其前面添加constant

[jass]constant function abc takes nothing returns string
     set udg_s=( udg_s + udg_s2 )
     return udg_s
endfunction //不合法![/jass]

此函数将不合法,并会在保存时出错。

但是,若将函数体合并为以下形式:
[jass]constant function abc takes nothing returns string
     return ( udg_s + udg_s2 )
endfunction //合法![/jass]

该函数将重新变得合法。

因此在常数函数中我们仍然可以对全局变量进行读取,但是不能修改它们。

另外,我们也不能在常数函数体中调用非常数函数,即使那是一个CJ函数。
[jass]constant function abc takes integer i returns integer
    loop
        exitwhen i > 10
        set i = (i + 1 )
    endloop
    return i
endfunction

constant function abcd takes nothing returns string
return I2S(abc(1))
endfunction//不合法! [/jass]
以上函数不合法,因为常数函数abcd()调用了I2S这个CJ函数。

而以下调用方式是合法的:
[jass]constant function abc takes integer i returns integer
    loop
        exitwhen i > 10
        set i = (i + 1 )
    endloop
    return i
endfunction

constant function abcd takes nothing returns integer
return (abc(1)+1)
endfunction //不合法![/jass]
这里常数函数abcd()只调用了常数函数abc()因此合法。

另外,非常数函数调用常数函数是不受限制的:
[jass]constant function abc takes integer i returns integer
    loop
        exitwhen i > 10
        set i = (i + 1 )
    endloop
    return i
endfunction

function abcd takes nothing returns string
return I2S(abc(1))
endfunction//合法! [/jass]
这个例子和上上个例子相比,第2个函数去掉了个constant ,因此变成了非常数函数,变得合法了
发表于 2006-6-1 16:00:29 | 显示全部楼层
貌似还是木啥作用
回复

使用道具 举报

发表于 2006-6-1 16:15:36 | 显示全部楼层
作用是靠人来发觉的嘛,当初TRACKABLE刚出来的时候也是被认为没什么作用的,但是现在应用面已经很广了
回复

使用道具 举报

 楼主| 发表于 2006-6-1 16:18:48 | 显示全部楼层
[jass]
function abc takes nothing returns string
     set udg_s=( udg_s + udg_s2 )
     return udg_s
endfunction
[/jass]

[jass]
constant function abc takes nothing returns string
     return ( udg_s + udg_s2 )
endfunction
[/jass]

仔细看以上2个函数,虽然它们返回值一样,但是其实有一个地方大不一样,那就是上一个函数执行结束后,udg_s变成了 udg_s + udg_s2 ,但是下一个函数执行完后udg_s的值没有任何改变。无论怎么写,常数函数都无法改变全局变量。这可能正是其称为常数函数的原因。
回复

使用道具 举报

发表于 2006-6-1 18:05:09 | 显示全部楼层
关于constant function 这是老外的jass手册上的介绍:
原地址 http://jass.sourceforge.net/doc/
If a function declaration is prefixed with constant, like the following:

constant function const_func takes integer a returns nothing
     ...
endfunction

then you can not call non-constant functions within the function body. (Nevertheless, note that you can still use the set statement in the body to alter function arguments, so it is not really \"constant\" in the typical sense; it is more of a hint to the programmer than anything else)


它的意思应该是说constant function 里可以调用别的constant function 但不能调用非constant function 也可以在constant function里对参数直接使用set语句 所以这个constant function 主要是对编程者一个提示的作用

[ 本帖最后由 illlusion 于 2006-6-1 18:12 编辑 ]
回复

使用道具 举报

发表于 2006-6-1 18:44:57 | 显示全部楼层
确实,我没发现其能改变参数的值。
现在去试验了下果然如此。

但是常数函数确实不能改变其余变量的值。毕竟参数是仅仅存在于该函数体内的局部变量。


我还发现在constant函数体中可以还可以声明非参数的局部变量,并可以改变它的值

[jass]constant function abc takes string s returns string
local string a
set a=\"11\"
set s=( udg_s + udg_s2 +a)
return s
endfunction //合法![/jass]
这个constant应该是指它不能影响除属于自己以外的变量。或者说,常数函数无法改变全局变量的值

[ 本帖最后由 麦德三世B 于 2006-6-1 18:47 编辑 ]
回复

使用道具 举报

发表于 2006-6-1 18:48:03 | 显示全部楼层
呃。可以用其它的语句。比如循环么?
回复

使用道具 举报

发表于 2006-6-1 18:54:17 | 显示全部楼层
如果循环体内的语句符合“不改变全局变量”和“不调用非常数函数”那么循环就是可用的。
以下仍然合法
[jass]
constant function abc takes integer i returns integer
    loop
        exitwhen i > 10
        set i = (i + 1 )
    endloop
    return i
endfunction //合法!
[/jass]
回复

使用道具 举报

发表于 2006-6-1 18:55:18 | 显示全部楼层
就新获得的资料重新来整理一遍顶楼
回复

使用道具 举报

 楼主| 发表于 2006-6-1 19:15:27 | 显示全部楼层
整理好了。大家再看看有什么问题没。
回复

使用道具 举报

发表于 2006-6-2 01:08:10 | 显示全部楼层
haha.....明白老
回复

使用道具 举报

发表于 2006-12-15 14:13:33 | 显示全部楼层
恩  好东西
回复

使用道具 举报

发表于 2006-12-29 13:35:49 | 显示全部楼层
作用仅仅指示jass程序员该函数不对参数指向的对象做任何修改。
回复

使用道具 举报

发表于 2006-12-29 20:47:28 | 显示全部楼层
恩 jass果然有很多java的特点

ps:稍微看到点小笔误
  1. 而以下调用方式是合法的:
  2. [jass]constant function abc takes integer i returns integer
  3. loop
  4. exitwhen i > 10
  5. set i = (i + 1 )
  6. endloop
  7. return i
  8. endfunction
  9. constant function abcd takes nothing returns integer
  10. return (abc(1)+1)
  11. endfunction //不合法![/jass]
  12. 这里常数函数abcd()只调用了常数函数abc()因此合法。
复制代码

那个"//不合法!"貌似应该是合法吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-2 10:46 , Processed in 0.071865 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表