-2

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

我尝试了许多不同的语法变体,结果是:

  1. Unexpected else or end, expecting }
  2. 变量没有得到正确评估,即@reUrl最终 ="@reUrl2"

任何帮助,将不胜感激。

这是我的代码的摘录:

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    
4

1 回答 1

6

tl;博士我终于弄清楚了你想要做什么。虽然关于您滥用字符串插值,以下答案仍然完全准确,但您实际上追求的是instance_variable_get. 我没有意识到您正在尝试访问名称存储在字符串中的变量的值。


您使用字符串和插值有很多错误。"#{}"仅当您想在字符串中嵌入变量时才需要使用。几乎在每种情况下,您都在错误地使用它。下面举几个具体的例子。

首先,不要这样做:

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访问@reUrl1or的值,这一行是正确的@reUrl2

"@reUrl#{redeyeid}"

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

"#{@reUrl}#{redeyeid}"

这条线也真的断了:

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

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

因为这里有太多的错误,所以我会试着把方法写成应该写的,希望你能从中有所收获。在编写更多 Ruby之前需要了解. 它是字符串插值#{}

def change_redeye(redeye)
  redeyeid = @redeyeId[redeye.downcase.strip]

  if redeyeid > 0
    say "OK. Changing to RedEye #{redeye}."
    @reUrl = instance_variable_get("@reUrl#{redeyeid}")
  else
    say "Sorry, I am not programmed to control RedEye #{redeye}."
  end
  request_completed   
end
于 2012-10-27T16:25:36.463 回答