2013-06-14 10 views
6

Sadece merak ediyorum, Ruby'de Makro'yu kullanmanın bir yolu var mı?Ruby'de Makrolar?

Örneğin

:

define ARGS 1,2 
sum(ARGS) # returns 3 

DÜZENLEME:

@button1 = FXButton.new(self, "Button 1", ALLBUTTONPROPERTIES) 
@button2 = FXButton.new(self, "Button 2", ALLBUTTONPROPERTIES) 
@button3 = FXButton.new(self, "Button 3", ALLBUTTONPROPERTIES) 
: Ben kodu gibi bakmak isterdim

@button1 = FXButton.new(self, "Button 1",:opts => BUTTONPROPERTIES,:width => width, :height => height) 
@button2 = FXButton.new(self, "Button 2",:opts => BUTTONPROPERTIES,:width => width, :height => height) 
@button3 = FXButton.new(self, "Button 3",:opts => BUTTONPROPERTIES,:width => width, :height => height) 

Ve ideal olarak: Daha spesifik benim sorunum daha benziyor

Baştan sona doğru şekilde geçirilmeyecek "genişlik" ve "yükseklik" değişkenlerine sahip olduğuma dikkat edin FXButton sınıfının, bunları önceden belirlenmiş bir değere ayarlamış olursam alileştirilmesi. Bu konuyla ilgilenecek bir çeşit kod ikamesi var mı?

+4

* Sorunu açıklayabilir misiniz, w/Ruby'yi çözmeye çalışıyorsunuz? O zaman belki de soruya daha iyi cevap verebiliriz. – Pete

+0

Gerçek "problem", 3 argüman için aynı değerleri tekrar tekrar bir fonksiyona yazmam ve sadece birini değiştirmem. Sorun şu ki yazdığım aynı argümanların bazıları değişkenlerdir. – thecooltodd

cevap

9

Makroya ihtiyacınız yok. Sadece bir değişken veya bir sabit tanımlayın.

Böyle yapabilirsiniz Sorunuzun düzenlemek sonra


A = [1, 2] 
A.inject(:+) # => 3 
:
ALLBUTTONPROPERTIES = ->{{opts: => BUTTONPROPERTIES, width: width, height: height}} 

ve sabitler ve değişkenler BUTTONPROPERTIES, width, height olduğu bir bağlamda

bir değer atandı, bunu yap:

@button1 = FXButton.new(self, "Button 1", ALLBUTTONPROPERTIES.call) 
@button2 = FXButton.new(self, "Button 2", ALLBUTTONPROPERTIES.call) 
@button3 = FXButton.new(self, "Button 3", ALLBUTTONPROPERTIES.call) 
+0

Arama ne yapar? Onu hiçbir yerde bulamıyorum. Bu, genişlik ve yükseklik değerlerini yeniden atar mı? -> operatör ne yapar? Tekrar teşekkürler. – thecooltodd

+0

'-> {...}' lambda denir. Bir 'Proc' nesnesi oluşturur. Yaratılışında değerlendirilmez. 'call', verilen bağlam içinde değerlendirir. – sawa

+0

Mükemmel! Bir lambda yaratmanın sözdizimi diye bir fikrim yoktu. Teşekkürler. En iyi cevap. – thecooltodd

7

Yakutta ön işlem yoktur, makrolar mantıklı değildir. Sadece dize sabitini veya ihtiyacınız olan başka bir sabit türü kullanın.

7

Yapmaya çalıştığınız şey hakkında muhtemelen başka bir yol var. Önişlemciler makrolar mantıklı değil çünkü Ruby derlenmiş bir dil değil, yorumlanmış bir dil. Bu örnekte

@buttons = ["Button 1", "Button 2", "Button 3"].map do |name| 
    FXButton.new(self, name, 
       :opts => BUTTONPROPERTIES, 
       :width => width, 
       :height => height) 
end 

: muhtemelen yaklaşımdan biraz farklı olurdu sorununuzu çözme

args = [1, 2] 
sum(*args) # equivalent to sum(1, 2) 
+2

Şimdiye kadar aldığım en iyi cevap budur.Neredeyse tam olarak aradığım şey. Basit ve faydalı bir cevap sağlamak için – thecooltodd

+2

+1. –

+0

@downvoter, açıklamak için aklınız var mı? – Shoe

3

Yakut yolu:

Özellikle sizin örneğin bunu yapmak için çok temiz bir yolu vardır @button1, @button2, @button3 değişkenleri yok. Bunun yerine, @buttons, üçünü de içeren dizindir.

+0

ruby ​​(iş parçacığı güvenli otomatik yükleme) sorunumu tam olarak açıklayamadım farkındayım. Bunu 1-3 düğümü için yapsam bile, tamamen farklı bir sınıfa (sadece örnekleme değil) başka 3 düğme daha yapmak zorunda kalabilirim, bu yüzden bu kodun tümünü yeniden yazmam gerekiyordu. – thecooltodd

İlgili konular