Bloğu bir dize olarak tanımlamak ve sonra lambda oluşturmak istiyorum. Aşağıdaki örnek işe yaramıyor. Böyle bir şey mümkün mü?Dizgiden bir ruby Proc oluştur
code_string = "|x|x*2"
l = lambda {eval(code_string)}
l.call(3) => 6
Bloğu bir dize olarak tanımlamak ve sonra lambda oluşturmak istiyorum. Aşağıdaki örnek işe yaramıyor. Böyle bir şey mümkün mü?Dizgiden bir ruby Proc oluştur
code_string = "|x|x*2"
l = lambda {eval(code_string)}
l.call(3) => 6
Bu bunu yapar ve diğer desteklemez Sadece neden bilmiyorum
eval "lambda { " + code_string + " }"
çalışır.
Bir eval argümanı üzerinde lambda çağrılması, Proc nesnesinde "içeride" eval çağrısı olan bir Proc nesnesine neden olur. Oluşan Proc nesnesi bir argüman almaz, çünkü 'eval (code_string)' ifadesi bir argüman almaz. Proc nesnesini çağırdığınızda, code_string değerlendirir! "lambda {" + code_string + "}" dizesinin değerlendirilmesi, bir argüman bekleyen bir Proc nesnesi verir ve 2 * argümanını döndürür. – Fred
Ayrıca, string interpolasyonunu kullanmak daha idiomatik (ve önyükleme için daha verimli), bu yüzden: "eval" lambda {# {code_string}} "' olacaktır. Ruby ile birkaç dizeyi '+' ile birleştirmek nadiren yapılır. – Chuck
eval "lambda {#{code_string}}"
ama neden dünyada bunu yapmak istiyoruz? “eval” neredeyse hiçbir şey yapmanın en iyi yolu değildir, verimlilik için ise başka bir şey yoktur. – Chuck
Bu kesinlikle oldukça hacky görünüyor –
Bazen "on-the-fly", genellikle Ruby kodu olmayan bir kaynaktan kod oluşturmanız gerekir. Transpiler uygulamak için bu tekniği kullanıyorum. –