Re: [問題] 用String設定數值陣列

作者: chungyuandye (養花種魚數月亮賞星星)   2013-06-07 20:39:33
※ 引述《TTLLIU (kerker)》之銘言:
: Code:
: hz = StringToStream[h1];
: h2 = ReadList[hz, Word];
: Close[hz];
: ToExpression[h2[[1]]]={1,2,3}
: 簡單說明一下:
: (1)h1本身是包含空格的String
: (2)h2則把h1的每段String用空格為依據切成好幾個Word存成List
: (3)第三步我則想要令h2中的Word為某個數值List
: 前兩步都沒有問題,但是第三步會跳出錯誤訊息
: Set::write: Tag ToExpression in ToExpression[Energy] is Protected.
: 這裡的Energy就是存在h2[[1]]中的字元。
: 目前看起來是lhs=rhs這個指令對lhs有所限制,
: 不過總覺得我的思考方向可能有根本的錯誤.........
: 不曉得有沒有高手可以指點一下呢?感恩。
Clear["Global`*"];
h1 = "ab bc cd";
data = {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}};
hz = StringToStream[h1];
h2 = ReadList[hz, Word];
MapThread[Set[Evaluate@ToExpression[#1], #2] &, {h2, data}];
ab
bc
cd
作者: LPH66 (-6.2598534e+18f)   2013-06-07 21:41:00
解釋一下, 這是因為 Set (=) 具有 HoldFirst 屬性,所以第一個參數會保留原狀 (這通常是想要的, 例如 a = 3 時我們顯然不該去求 a 的值而是將 a 這變數設為 3但這裡這就造成了問題) Evaluate 就是強制求值的意思在被保留的參數上用 Evaluate 則被套用的東西就會強制算完所以能夠以此來達成動態設定變數的目的
作者: TTLLIU (kerker)   2013-06-07 22:13:00
感謝兩位解釋 非常有用的資訊!!

Links booklink

Contact Us: admin [ a t ] ucptt.com