2017-01-04 5 views
0

私はこれを行うことができます。Rubyでは、それは方法でこれに似た何かをするだけで可能ですJavascriptのように1つの単語にキーの値を渡す方法はありますか? JavaScriptで

myVar = 1 
obj = { myVar } 
obj.myVar == 1 // true 

、キーワード引数で:

def foo(a:, b:) 
    [a,b] 
end 
foo(a: 1, b: 2) # [1,2] 

を実際に私は、これはより多くのコードを作る見つけます詳細。むしろ私はシーケンシャル引数をどう思いとして、一度変数に名前を付けるよりも、私は引数としてそれを送信するために二回、それに名前を付ける必要があります:

def method_1(a:, b:) 
    method_2(a: a, b: b) # repetition is here 
end 

私はとして機能**オペレータの承知していますキーワード引数のためのスプラット。しかし、私はコードをあまり理解しづらいので、メソッド定義にスプラットを入れないでください。

キーワード引数は無用です(これはoptionsハッシュを解析するよりもはっきりしています)が、Javascriptのような通常のハッシュ構築をサポートしていると便利です。

とにかく、Ruby自体でこれを行う方法があるのか​​、別の言語を見なければならないのでしょうか?ルビー自身でこれを行うにはどのような方法があるかどう

+2

「a:a」と入力する必要があるため、実際にはこの言語を放棄しますか? – meagar

答えて

0

あなたが欲しい場合はBindingクラス

require 'debug_inspector' 

def fun(names) 
    RubyVM::DebugInspector.open do |inspector| 
    names.zip(names.map { |name| eval(name, inspector.frame_binding(2)) }).to_h 
    end 
end 

a = 1 
b = 2 
h = fun %w{a b} 
p h 
# => {"a"=>1, "b"=>2} 

あるいは、

に関数を定義したくない場合は、この

class Binding 
    def fun(names) 
    names.zip(names.map(&method(:eval))).to_h 
    end 
end 

a = 1 
b = 2 
h = binding.fun %w{a b} 
p h 
# => {"a"=>1, "b"=>2} 

あるいは、

をお試しください本当に簡潔な構文であり、組み込みのバックティック関数を使用する予定はありません。

require 'debug_inspector' 

def `(str) 
    # overrides builtin ` function, use with caution! 
    RubyVM::DebugInspector.open do |inspector| 
    str.split(?,).zip(eval("[#{str}]", inspector.frame_binding(2))).to_h 
    end 
end 

a = 1 
b = 2 
h = `a, b` 
p h 
# => {"a"=>1, "b"=>2} 
+1

これはOPが参照しているのとはまったく異なる構文です。また、コードが完全ではありません。あなたは '束縛'を決して初期化しません。明らかに、OPのためにこのメソッドでコードを簡潔にしているわけではありません。 –

+2

'binding'を初期化する必要はありません – akuhn

+0

私は自分の間違いであることを認めます。しかし、そうであっても、あなたのコードは実際にOPリクエストのようなjavascriptのコンセプトと非常によく似ていると主張していますか? –

2

とにかく、私は

いいえ、ありません、と思いまして。

+0

実際にこれを行う方法があります。 – akuhn

+0

@akuhnいいえ、ありません。あなたの方法は近いものではなく、限られた成功を達成するためにMRI特有の機能に依存しています。その結果、技術的には*変数名の繰り返しを避けることができますが、代わりにそれらをラップする必要があります'binding.fun%w {...}'はほとんど改良されていません。そのような擬似構文拡張は避けなければなりません。独自のRubyロケールの開発は望ましくありません。 – meagar

+0

'Kernel#' ' – akuhn

関連する問題