论坛首页 编程语言技术论坛

求"代码块"的问题

浏览 1876 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-06  
这里说的代码块不是block,不是proc,也不是yield。不知道还有没有人记得VB中的sub关键字。

有一块代码,用sub包含起来,放在那里都运行,使用的是当前上下文的运行环境。

ruby代码写的多了,总有些代码代码,只有几行,但是到处丢,包装成函数吗,输入,输出参数一大堆。不见得方便。如果任由放那里,这个代码也不好看。

所以想用代码块,或者类似的概念。

不过找了些办法,总觉得不如意。最接近的解决办法是eval,但是。。。

举个例子来说



STR = "j = i+1;"


def test
	i = 100
	#j = 0
        eval(STR)
        puts j
	
end
test


这上面的执行结果是j没有定义,出错了。

需要这样写才可以,要在eval之前定义好j


STR = "j = i+1;"

def test
	i = 100
	j = 0
        eval(STR)
        puts j
	
end
test


我想要的代码块功能,就是不需要定义j,因为eval中间有赋值了,接下来的代码中直接使用j即可。

这样的代码块功能到底能否实现?


   发表时间:2008-11-06  
STR = "j = i+1;"  
  
  
def test   
    i = 100   
    #j = 0   
    eval(STR+'puts j')
end  
test
0 请登录后投票
   发表时间:2008-11-06  
加一个j = j

STR = "j = i + 1"

def test()
  i = 1
  eval(STR)
  j = j
  puts j
end

test
0 请登录后投票
   发表时间:2008-11-06  
这代码看似好奇怪,为什么要这样写?
0 请登录后投票
   发表时间:2008-11-06  
axgle 写道
STR = "j = i+1;"  
  
  
def test   
    i = 100   
    #j = 0   
    eval(STR+'puts j')
end  
test


puts 只是表示下面需要用到这个数据,并非一定要puts
0 请登录后投票
   发表时间:2008-11-06  
这个问题貌似是无解的,j=j这行很奇怪,也是声明变量作用?
0 请登录后投票
   发表时间:2008-11-06   最后修改:2008-11-06
jack 写道
这代码看似好奇怪,为什么要这样写?

据说是ruby parser的一个“bug”,和binding以及变量定义顺序有关系,我也不太清楚原理,只是以前遇到过。
0 请登录后投票
   发表时间:2008-11-06  
不过这样写,就没有意义了,比如我三行代码,最终得出三个变量,结果还需要重新赋值一次,还不如放原先的代码呢
0 请登录后投票
   发表时间:2008-11-06  
jack 写道
不过这样写,就没有意义了,比如我三行代码,最终得出三个变量,结果还需要重新赋值一次,还不如放原先的代码呢

如果要写得好看,就不能用eval了,你可以试试看用instance_eval+attr_accessor来包装一下
1 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics