0

私はPERLからRubyに変換しています。私が PERL で気に入っていることの 1 つは、コマンドを使用して、サブルーチン内にローカル スコープを設定できることです。IE $only_in_the_if が範囲外であるため、このコードは機能しません。

...
if (cond) {
my ($only_in_the_if) = bar($foo );
}
bar1($only_in_the_if) ; #can't work, $only_in_the_if scope is finished
...

Ruby ではメソッドのスコープ内に only_in_the_if が存在します。何か案は?

4

2 に答える 2

0

RubyのコードブロックはPerlやAFAIKとは異なり、ifなどの複合ステートメント内でのみ字句的に変数を宣言的にスコープする簡単な方法はありません。

Tarynによって提案されたコードブロックを使用できます。メリットがコストを上回るかどうかはわかりません(実行速度と他のRuby開発者の作業方法との違いの点で)。

もう1つの簡単な解決策は、複合ステートメントを軽量に保ち、より短いメソッドに依存して厳密な変数スコープを実現することです。Perlでは、ifsとfors内に4行または5行の小さなサブブロックを持つ30行のメソッドを作成できますが、Rubyでは、メインフローといくつかの制御メソッドを使用して同じフローとスコープを実行できます。変数のスコープが設定されているプラ​​イベートメソッド。これらのメソッド間で共有されるデータは、オブジェクト状態(@変数内)または制御メソッド内のスコープ変数であり、パラメーターとしてプライベートメソッドに渡されます。

def main_method foo
  if (cond)
    bar foo
  end
end

private 
def bar param
 only_in_bar = Math.whatever(param)
 # Do some stuff with only_in_bar
end 
于 2013-03-07T12:19:21.687 に答える
0

単純なスコープは明らかに条件内に留まりません...

irb(main):001:0> if my_cond
irb(main):002:1>   my_var = 'blah'
irb(main):003:1>   puts my_var
irb(main):004:1> end
blah
=> nil
irb(main):005:0> puts my_var
blah
=> nil

ただし、ブロックを使用してスコープを強制することはできます...少し奇妙ですが。

irb(main):006:0> 1.times { new_var = 'blah'; puts new_var } if my_cond
blah
=> 1
irb(main):007:0> new_var
NameError: undefined local variable or method `new_var' for main:Object
    from (irb):7
    from :0

必要に応じて、おそらくそれを「my」というメソッドにメタプログラムできます;)

于 2013-03-07T11:21:49.007 に答える