2009-10-06 19 views
8

Nasıl dönüştürülebilir: obj, def'in içindeki obj olarak adlandırılan bir değişkene dönüşebilir?Yakut - sembolden başlığa dönüş

def foo(bar) 
    bar.some_method_call 
end 

foo :obj 

GÜNCELLEME: son kod bundan daha ayrıntılı ama ...

ben

foo :obj 

yerine

foo obj 
söylemek mümkün olmak ister

DSL benzeri bir sözdizimi üzerinde çalışıyorum. Ve bu tek bir değişiklik, bazı şeylerin daha net bir şekilde okunmasına izin verirdi.

+0

bu çubuğunun içindeki temsil sizin sembolü anlamına mı, doğrudan bir örnek değişkeni karşılık gelir:

diğer alternatif foo arayıp bağlanma geçmektir? – Matt

cevap

0

Neredeyse kesinlikle yapamazsınız. Bu tanım, arama kapsamının yerel değişkenlerine erişemez. Ne yapmaya çalıştığınızı biraz daha açıklamak isterseniz, yararlı bir alternatif sunabiliriz.

+0

bkz. Güncelleme ve yorumlar – BuddyJoe

11

Örneğinizde ne tür bir değişken obj şeklindedir? Eğer foo'nun çağrıldığı kapsamın yerel bir değişkeni ise, eğer geçerli ciltlemeyi ikinci bir parametre olarak geçmediğiniz sürece içeriden erişilemez. Eğer örneğini değişken @obj erişmek istiyorsanız

, kolay:

def foo(bar) 
    instance_variable_get("@#{bar}").length 
end 

@obj = "lala" 
foo("obj") #=> 4 
+0

obj, foo kapsamı dışındadır. +1 iyi bilgi – BuddyJoe

1

Eğer değişken veya erişimci yöntemini ifade ediyor mu? Sepp2k, bir örnek değişkeninin adını verdi; Bir erişimcisine için

def foo(bar) 
    self.send(bar).some_method_call 
end 
4

Sen Biraz tuhaf, ama boş bir blok geçmek isteyen varsa (yine birini geçiyoruz ya), alabilirsiniz eval

def foo(bar) 
    eval(bar.to_s).some_method_call 
end 
3

kullanabilirsiniz kullanmak bloktan bağlama, ardından eval arayıp bağlayıcı pass:

def foo(symbol, &block) 
    binding = block.send(:binding) 

    eval(symbol.to_s, binding) 
end 

var = 3 

puts foo(:var) {} 

Bu yazdırır 3.

Alternatif olarak, ActiveSupport'un Binding.of_caller adında bir şeye sahip olduğunu görebilirsiniz, böylece bloğu geçmek zorunda kalmazsınız, ancak ne kadar iyi çalıştığını bilmiyorum.

def foo(binding, symbol) 
    eval(symbol.to_s, binding) 
end 

binding = self.send(:binding) 
var = 3 

puts foo(binding, :var)