2009-07-24 54 views
0

我有点奇怪的情况。如果我使用散列,这个问题很容易,但是,我试图在Ruby中使用“OpenStruct”,因为它提供了一些非常酷的功能。(Ruby)将字符串值转换为OpenStructs的可分配属性...?

基本上,我认为我需要“常量化”一个返回值。我有一个正则表达式:

textopts = OpenStruct.new() 
    textopts.recipients = [] 
    fileparts = fhandle.read.split("<<-->>") 

    fileparts[0].chomp.each{|l| 
    if l =~ /Recipient.*/i 
     textopts.recipients << $& 
    elsif l =~ /(ServerAddress.*|EmailAddress.*)/i 
     textopts.$& = $&.split(":")[1] 
    end 
    } 

我需要一种方法来打开$ &为“textopts”为有效的属性填充。我试过“constantize”和其他一些,但没有任何工作。我会认为这是可能的,但也许我错了。显然,如果我使用散列,我可以做“textopts [$ &] = .....”。

任何想法?

回答

2

保持您的解决方案的结构,这是做这件事:

textopts = OpenStruct.new(:recipients => []) 
    fileparts = fhandle.read.split('<<-->>') 

    fileparts.first.chomp.each_line do |l| 
    case l 
    when /Recipient.*/i 
     textopts.recipients << $& 
    when /(Server|Email)Address.*/i 
     textopts.send "#{$&}=", $&.split(':')[1] 
    end 
    end 

但我不禁想,这应该是一个适当的解析器。

+0

谢谢你。请定义“正确的解析器”。我基本上用电子邮件做了一些小事,并通过Ruby的NET :: SMTP模块发送。我使用OptionParser来处理命令行项目,但我正在阅读实际的文本文件。我期望在文本文件顶部存在某些参数,并且只需手动抓取这些项目,其余部分实际上是电子邮件本身,将被“抢走”并发送出去。 – 2009-07-24 14:21:34