-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;dr あなたが何をしようとしているのか、ようやくわかりました。以下の回答は、文字列補間の誤用に関してはまだ完全に正確ですが、実際に求めているのはinstance_variable_get. 名前が文字列に格納されている変数の値にアクセスしようとしていることがわかりませんでした。


ここでは、文字列と補間の使用に多くの問題があります。"#{}"文字列内に変数を埋め込みたい場合にのみ使用する必要があります。ほとんどすべてのケースで、間違った使い方をしています。以下にいくつかの具体例を示します。

まず、これをしないでください:

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

1 つには、文字列に 2 回変換しています。を最初に使用した後は、すでに文字列です#{}。でも、そんなことは最初からしてはいけません。変数を文字列に変換する場合は、 を使用しto_s、前のメソッドの戻り値で後続のメソッド呼び出しをチェーンします。

redeye = redeye.to_s.downcase.strip

この行は本当に壊れており、(私が知る限り)文字列補間さえ必要ありません:

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

@redeyeIdが整数の配列の場合、これが必要です:

redeyeId = @redeyeId[redeye]

この行は構文的には正しいかもしれませんが、かなり壊れています:またはinstance_variable_getの値にアクセスするために使用する場合、この行は正しいです:@reUrl1@reUrl2

"@reUrl#{redeyeid}"

メンバー変数と通常の変数#{}を補間するために使用する必要があります。@variable行はおそらく

"#{@reUrl}#{redeyeid}"

この行も本当に壊れています。

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

これは何をすることになっていますか?私は一生、あなたの意図がここにあるのか理解できません。実際に行っているのは、文字列内で Ruby コンテキストを開くことです。これにより、すぐに comment が開きます。その結果、行の残りの部分が無視され、次の行に構文エラーが発生します。これが何をするのかはわかりませんが、何の役にも立ちません。

ここには多くの間違いがあるので、書かれるべき方法でメソッドを書こうと思います。そこから何かを得られることを願っています。これ以上 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 に答える