失落的乐章 发表于 2012-8-31 18:48:22

关于常量名

比如说现有以下100个常量(只是举个例子),A1 = 1
A2 = 2
A3 = 3
………………
A100 = 100现在要依据这100个常量的名字执行互不相同的操作,比如A1就乘以1,A2就乘以2,如果一个一个写太麻烦了。不知能不能像用for循环那样,常量名里那个数字依次迭代为1..n,再执行操作?

                     【其实我是来试试看这里有没有人来回答问题】

satgo1546 发表于 2012-9-17 19:24:38

爱eval(好吧我承认我没效率)100.times do |i|
eval("A#{i} *= A#{i}")
end

失落的乐章 发表于 2012-10-7 13:29:35

satgo1546 发表于 2012-9-17 19:24 static/image/common/back.gif
爱eval(好吧我承认我没效率)

以eval的效率这样会卡死的

翎·仲秋 发表于 2012-10-7 17:33:33

记得Ruby有些地方和C一样

烁灵 发表于 2012-10-7 19:58:29

const_get试试?A1 = 1
A2 = 2
A3 = 3
for i in 1..3
        p Object.const_get("A#{i}")
end效率什么的不懂_(:3ゝ∠)_

Ruby200 发表于 2013-3-11 07:29:10

本帖最后由 Ruby200 于 2013-3-11 07:45 编辑

symbol也可以用字符串内插:

class A
(1..100).each {|x|
    const_set :"A#{x}", x
}
p A43
end

p A::A42



另外下面的eval也未必很慢:

class A
#↓在这个具体语境可以用eval和instance_eval替换
class_eval ["def self.work",
                     *(1..100).map{|x| "const_set :A#{x}, #{x}"},
                "end"].join("\n")

end


A.work
A.work
A.work
p A::A42



懒之圣帝 发表于 2013-5-10 20:24:26

好了,思考了N个月,我只知道把这100个常量扔数组之后遍历一次就完了。话说Ruby有取得常量名的函数?{:nm07:}

lbq 发表于 2013-5-11 07:41:36

研究了一下发现其实主要用instance_variable_set,还有const_set以及class_variable_set就可以的=-=。当然各种class eval啊instance eval啊啥的都可以的说。。。。

其实我要吐槽为毛不用一个数组呢。。那样多简单=-=
页: [1]
查看完整版本: 关于常量名