2016-05-02 9 views
0

次のコードがRubyで何をしているのか、他の言語で同じことができるのか知りたいですか?Rubyコードを解釈する

def func(a) 
    $i ||= -1 
    eval %w(1 -1 3 6 1 1 -1 2 4 1)[$i+=1] 
end 

私が間違っていない場合、$iはグローバル変数を参照することがわかります。しかし、私は残りが何をしているのか、他のプログラミング言語でこれをどうやってやれるのか分かりません。

答えて

2
$i ||= -1 

これはデフォルト値を設定しています。 $iが0の場合は$iを-1に設定します。そうでない場合は$iは変更されません。

eval %w(1 -1 3 6 1 1 -1 2 4 1)[$i+=1] 

ここにはいくつかの部分があります。

  • evalは、提供される文字列のRuby表現を評価します。 eval "5 + 5"を実行すると、Rubyは文字列を評価して5 + 5を実行し、10を返します。
  • %wは、単語配列を作成するためのRubyショートカットです。与えられた値から文字列の配列を作成します。 %w(testing this)
  • [$i+=1]["testing", "this"]%wによって作成された配列にアクセスしているが返されます。 $i+=1が評価され、1を加えて$1とし、配列内のその要素にアクセスします。 $i = -1があり、["testing", "this"][$i+=1]を行うと、"testing"が返されます。 $iは0になるので、私たちは基本的に["testing", "this"][0]をした、と0番目の要素は、すべてのすべてで

を「テスト」され、どのような機能がないことはあるだろう$私はちょうどゼロかである場合、配列の最初の要素を返します。ただ、アレイからI + 1つの要素を返し、配列あなたが簡単に任意のプログラミング言語でこれを行うことができます ["1", "-1", "3", "6", "1", "1", "-1", "2", "4", "1"]

で次の要素を返します。だから、Pythonでこれを行うには

アップデート1

i = None 
def func(a): 
    global i 
    if i==None: 
     i = -1 
    i = i + 1 
    return ["1", "-1", "3", "6", "1", "1", "-1", "2", "4", "1"][i] 

アップデート2 Rubyであなたが設定し$を使用して、グローバル変数にアクセスするには、Pythonであなたはグローバル変数を宣言する必要が機能はglobalです。RubyとPythonは確認してくださいので、グローバル変数を使用すると、

は、私が最初の更新にi = Noneを追加した3 更新、グローバル変数を定義する必要がグローバル変数にアクセスすることを意味し、危険である

更新4そのまま あなたがアップデート1からコードを実行した場合、それはNoneiをリセットし続けるには、次の要素

を返すために、再度 func(a)を実行する必要があります0
>>> i = None 
>>> func('test') 
'1' 
>>> func('test') 
'-1' 
>>> func('test') 
'3' 
>>> func('test') 
'6' 
>>> func('test') 
'1' 
+0

このコードはどのように見えるのですか? – user120931

+0

また、私はなぜi || = -1と言うことができませんか? – user120931

+0

それは私にエラー "グローバル名 '私は定義されていません" – user120931

関連する問題