|
查看: 1391|回复: 15
|
希望交个朋友研究actionscript
[复制链接]
|
|
|
发表于 26-3-2008 02:58 AM
|
显示全部楼层
回复 1# inez 的帖子
好。
就请教一下,为何Action Script 对于String 类或Number 类不能够直接使用call by reference的方法去操作 ? |
|
|
|
|
|
|
|
|
|
|
发表于 26-3-2008 11:55 PM
|
显示全部楼层
那你要问 adobe/macromedia 了
不过 , 其实对script 来说,所有东西都是 string。 |
|
|
|
|
|
|
|
|
|
|
发表于 27-3-2008 06:12 AM
|
显示全部楼层
原帖由 donynam 于 26-3-2008 02:58 AM 发表 
好。
就请教一下,为何Action Script 对于String 类或Number 类不能够直接使用call by reference的方法去操作 ?
ActionScript 的始祖也就是 Java, 在 Java 中只有 pass by value(也就是記憶體位置內的值), 而沒 pass by reference(記憶體位置). 所以無法把新的值賦予到指定的記憶體位置.
小小驗證
var obj1:Object = new Object();
obj1.a = 10;
var obj2:Object = new Object();
obj2.a = 100;
function swapObj(c:Object, d:Object) {
c.a = 200; //賦予 c 值中 a 位置
var temp:Object = c; //把 c 值賦予到 temp 記憶體位置中
trace("temp.a = "+temp.a); //此刻 temp.a 和 c.a 是同時指向同一個記憶體位置, 所以更動 temp.a 那麼 c.a 的值也會跟著變動
c = d; //把 d 值賦予 c 值, 但因為沒傳遞 c 的記憶體位置, 所以 c 無法改變內容值
temp.a = 1; //賦予 temp 中 a 記憶體位置
d = temp; //理論同上
}
swapObj(obj1, obj2);
trace(obj1.a+", "+obj2.a);
p/s : 把 obj1 想像成一間房間, 而 obj1.a 則是房內的一個櫃子
原帖由 tensaix2j 于 26-3-2008 11:55 PM 发表 
那你要问 adobe/macromedia 了
不过 , 其实对script 来说,所有东西都是 string。
這樣說就不對了, 所有的型態都是定義出來的, 所以沒有甚麼都是屬於哪種型態, 數據來說就只是0和1 |
|
|
|
|
|
|
|
|
|
|
发表于 27-3-2008 10:15 AM
|
显示全部楼层
我想表达的是, 因为他是 interpreted script,所以。。
所以所有东西都是 string 直到有必要当成某形态 来执行。。 |
|
|
|
|
|
|
|
|
|
|
发表于 6-4-2008 01:30 AM
|
显示全部楼层
原帖由 tensaix2j 于 26-3-2008 11:55 PM 发表 
那你要问 adobe/macromedia 了
不过 , 其实对script 来说,所有东西都是 string。
此看法严重的错误,如果你留意一下那些 Action Script 的类(class), 你就可以发现到Object 是包括String,但不等同String.
例如:在Flex 3 里,
var txt:String = new Object (); <--- 错误
但是
var obj:Object = new String("fdfdfdfdfdf");<--- 正确。
由此可见 String 不是完全等同Object. |
|
|
|
|
|
|
|
|
|
|
发表于 6-4-2008 03:36 AM
|
显示全部楼层
原帖由 super-tomato 于 27-3-2008 06:12 AM 发表 
ActionScript 的始祖也就是 Java, 在 Java 中只有 pass by value(也就是記憶體位置內的值), 而沒 pass by reference(記憶體位置). 所以無法把新的值賦予到指定的記憶體位置.
小小驗證
var obj1:Object = n ...
ActionScript 看起来只会使用更多的内存去解决效率的问题而已。
例如:
package {
public class testing{
public function testing(){
var st1:String = "abc";
var st2:String ="abc";
st1 = append(st1); //<--- 低效率 因为必须将st1的内容也就是其值 阿abc 拷贝到append() 的txt那里,然后返回。
st2 = st2 + "efg"; //<--- 高效率 因为减少了一个拷贝的动作。
}
public function append(txt:String){
return txt + "efg";
}
}
}
再看看c 如何使用call by reference
#include <stdio.h>
void CallingByReference(char *input){
input[1] = 'a';
}
int main(int argc, char** argv){
char testword[10] = "went";
printf("Before call by Reference %s\n",testword);
CallingByReference (testword);
printf("After call by Reference %s\n",testword);
}
//output
//Before call by Reference went
//After call by Reference want |
|
|
|
|
|
|
|
|
|
|
发表于 7-4-2008 01:30 AM
|
显示全部楼层
原帖由 donynam 于 6-4-2008 01:30 AM 发表 
此看法严重的错误,如果你留意一下那些 Action Script 的类(class), 你就可以发现到Object 是包括String,但不等同String.
我说所有东西都是 string 因为 我是 从 script 的角度来看,
所以 可以 on run time 的 用 eval .. 因为所有东西 都是 string 直到被 eval。。。。 |
|
|
|
|
|
|
|
|
|
|
发表于 7-4-2008 02:17 PM
|
显示全部楼层
原帖由 donynam 于 6-4-2008 03:36 AM 发表 
ActionScript 看起来只会使用更多的内存去解决效率的问题而已。
例如:
package {
public class testing{
public function testing(){
var st1:String = "abc";
...
Java 和 C 不同點也在於無用的對象, JAVA會自動釋放記憶體歸還 Windows, 而 C 需要本身刪除才能釋放
去翻了一下找到回收機制的說明 
http://java.sun.com/docs/books/tutorial/java/javaOO/usingobject.html
[ 本帖最后由 super-tomato 于 7-4-2008 02:53 PM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 8-4-2008 03:20 AM
|
显示全部楼层
回复 9# super-tomato 的帖子
微软公司有一个称为dot net的 framework,这个framework也能够自动回收内存。
但是现在最大的问题是在于实际的效率。例如:处理100万条的String等等的事情。
目前,flash player 对于内存的处理存在着一个十分大的问题,那就是不能够强制回收内存,这种情况将导致内存溢出。
在flex 里有个 System.gc(),不过只能够在 AIR或者debug mode的 Flash 里使用。这真是莫名其妙的东西。
除了这个问题,在windows vista 的环境中因为浏览器的缺陷,尤其是IE,Flash 所使用的内存无法在短期内被释放出来,除非直接关掉整个浏览器。 |
|
|
|
|
|
|
|
|
|
|
发表于 8-4-2008 03:50 AM
|
显示全部楼层
回复 8# tensaix2j 的帖子
你还是不明白,楼上所谈的是高级语言的String 类,而非你所讲的,那些指令可以使用 eval来执行, 所以全部都是String.
你讲的是肉眼看到的“字”也就是String, 而楼上所讲的是抽象的String 物件。
“因为他是 interpreted script,所以。。
所以所有东西都是 string 直到有必要当成某形态 来执行。”
根据你讲的以上那点,可见你说不清楚interpreted script与所有东西都是 string的因果关系。
首先,为何 Interpreted script 都是 String ? eval 语言的写法 ?我可以告诉你,你也可以用 c语言 写一个eval function 出来,然后读文字,执行指令。那么 c 语言也都成了Interpreted script?
接着, 你在电脑上输入的每个字都是String, 无论interpreted script或者非interpreted script, 所以如何证明Interpreted script 都是 String ? |
|
|
|
|
|
|
|
|
|
|
发表于 8-4-2008 07:28 AM
|
显示全部楼层
原帖由 inez 于 21-3-2008 05:31 PM 发表 
我有一些actionscript上的问题。。。想问一问高手。。。 希望大家可以加入我 theng62@hotmail.com。。。也希望可以和会actionscript的朋友交流。
我不是高手,你应该比我还高,哈哈,有什么可以请教你吗??大家一起研究。。。add u msn le |
|
|
|
|
|
|
|
|
|
|
发表于 8-4-2008 08:32 AM
|
显示全部楼层
原帖由 donynam 于 8-4-2008 03:20 AM 发表 
微软公司有一个称为dot net的 framework,这个framework也能够自动回收内存。
但是现在最大的问题是在于实际的效率。例如:处理100万条的String等等的事情。
目前,flash player 对于内存的处理存在着一个十分 ...
無可厚非 Flash Player 對內存的釋放比 Java 慢的很多, 就像是在Flash中未完全載入圖片時候進行取消釋放對象的時候也不會即刻做處理, 非要在載入完畢之後才開始進行, 我使用C++嵌入 Flash 時執行一些載入預覽等特效之後也發現內存並沒完全回收, .
至於 flash.system.System 下的 gc 也很多人提問過既然只能在 Debug 的情況下強制回收也就沒意義存在. 但在測試時候 Flex 3 和 Flex 2 之間比較起來這類情況改善了很多
[ 本帖最后由 super-tomato 于 8-4-2008 08:35 AM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 8-4-2008 08:52 AM
|
显示全部楼层
原帖由 donynam 于 8-4-2008 03:50 AM 发表 
你还是不明白,楼上所谈的是高级语言的String 类,而非你所讲的,那些指令可以使用 eval来执行, 所以全部都是String.
你讲的是肉眼看到的“字”也就是String, 而楼上所讲的是抽象的String 物件。
“因为他是 i ...
对了。我所说的string是指字。。 可能之前应该用 text 比较贴切,可以避免误会。
其实我明白的。
只是不同看法而以 
不过 倘若 你真的用 C 写了 eval 的function
那么 你要 用这个 function 丢进去的 params 都是 string
我可以告诉你,你也可以用 c语言 写一个eval function 出来,然后读文字,执行指令。那么 c 语言也都成了Interpreted script?
这个我知道也做过。
不明白为何你会说 “那么 c 语言也都成了Interpreted script”
你用C 写 parser ,那个 parser 是要 interpret 一个 string , 这个string 可能是你自创的 scripting language ,又关c 什么事呢
C 只是给你 制作这个 interpretor 的语言 ,跟你 的parser 可以 interpret 的language 没什么关系吧。。
[ 本帖最后由 tensaix2j 于 8-4-2008 09:08 AM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 8-4-2008 02:05 PM
|
显示全部楼层
原帖由 tensaix2j 于 8-4-2008 08:52 AM 发表 
对了。我所说的string是指字。。 可能之前应该用 text 比较贴切,可以避免误会。
其实我明白的。
只是不同看法而以 
不过 倘若 你真的用 C 写了 eval 的function
那么 你要 用这个 function 丢进去的 ...
那非Interpreted script也是使用Text 处理啊 , 因为输入必定是Text.
on run time ?? Flash编译出来后已经是中间代码了, on run time也就是拿到Flash player 那里执行时,根本就没有所谓的eval(记住这是高阶指令,是一个Function) 处理指令了. 所以 Interpreted script 为何必定是String ? 你所举出的 eval 这个东西本来就是为了支持你所谓 "我说所有东西都是 string 因为 我是 从 script 的角度来看......"的说法, 中间代码都没有eval指令,所以你所说的到底是不是真的 ? |
|
|
|
|
|
|
|
|
|
|
发表于 8-4-2008 03:41 PM
|
显示全部楼层
我总是觉得。。。。
当我做
var a = 1 ;
它并不是储存了 0001 而是 0031 |
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|