Ruby#{}使用错误

时间:2012-10-27 16:23:15

标签: ruby

虽然我是Ruby新手,但我通过反复试验为Ruby编写了许多插件。

我尝试了许多不同的语法变体,导致:

  1. Unexpected else or end, expecting }
  2. 未正确评估的变量,即@reUrl将最终= "@reUrl2"
  3. 任何帮助将不胜感激。

    以下是我的代码的摘录:

    def initialize(config)  
      self.reip1 = config["reip1"]  
      self.reip2 = config["reip2"]  
      @reUrl1 = "#{self.reip1}:8080/redeye/rooms/0/devices/2/commands/send?commandId="  
      @reUrl2 = "#{self.reip2}:8080/redeye/rooms/0/devices/2/commands/send?commandId="  
      @reUrl = @reUrl2  
    end  
    
    . 
    . 
    . 
    . 
    
    
    def change_redeye(redeye)  
      redeye = "#{redeye}".downcase  
      redeye = "#{redeye}".strip  
      redeyeid = "#{@redeyeId["#{redeye}"]}".to_i  
      if redeyeid > 0  
        say "OK. Changing to RedEye #{redeye}."  
        # results in resel = "@reUrl2"  Does what I want.      
        resel = "@reUrl#{redeyeid}"    
        # FIXIT: need to end up with the URL of the device, but can't find the right syntax.     
        @reUrl = "#{#{resel}}"           
      else    
        say "Sorry, I am not programmed to control RedEye #{redeye}."     
      end    
      request_completed     
    end    
    

1 个答案:

答案 0 :(得分:6)

tl; dr我终于弄清楚你要做什么了。虽然以下答案对于您滥用字符串插入仍然完全准确,但您实际之后 之后是instance_variable_get。我没有意识到你试图访问名称存储在字符串中的变量的值。


使用字符串和插值时, lot 错误。您只需要在字符串中嵌入变量时使用"#{}"。几乎在每种情况下你都使用它不正确。下面是一些具体的例子。

首先,不要这样做:

redeye = "#{redeye}".downcase
redeye = "#{redeye}".strip

首先,您将转换为字符串两次。第一次使用#{}后,它已经是一个字符串。但你首先不应该这样做。如果要将变量转换为字符串,请使用to_s,并将后续方法调用链接到上一个方法的返回值:

redeye = redeye.to_s.downcase.strip

此行确实已损坏,并且(据我所知)甚至不需要字符串插值:

redeyeid = "#{@redeyeId["#{redeye}"]}".to_i

如果@redeyeId是一个整数数组,你只需要这个:

redeyeId = @redeyeId[redeye]

这一行可能在语法上正确但它也很破碎:如果您的意图是使用instance_variable_get来访问@reUrl1或{的值,那么这一行是正确的{1}}:

@reUrl2

您需要使用"@reUrl#{redeyeid}" 来插入#{}成员变量以及常规变量。该行应该是

@variable

此行确实已损坏:

"#{@reUrl}#{redeyeid}"

这甚至应该做什么?我不能为我的生活弄清楚你的意图在这里。你在实际做的事情是,在一个字符串中,打开一个Ruby上下文,立即打开一个注释,导致该行的其余部分被忽略,语法错误以下一行。我不知道你认为这是什么,但它没有做任何有用的事情。

因为这里有这么多错误,我将尝试编写编写的方法,并希望你能从中获得一些东西。在您再编写Ruby之前,需要learn what #{} does。它是字符串插值

@reUrl = "#{#{resel}}"