Ruby

2010-03-04 21 views
15

'da ek argümanları alan bir setter yöntemi oluşturma Ayarlayıcı olarak işlev gören ve atanan değerden başka bazı ek argümanlar alan bir yöntem yazmaya çalışıyorum. Aptal örnek:Ruby

class WordGenerator 
    def []=(letter, position, allowed) 
    puts "#{letter}#{allowed ? ' now' : ' no longer'} allowed at #{position}" 
    end 

    def allow=(letter, position, allowed) 
    # ... 
    end 
end 

bir dizin eserleri olarak yazılması ve böyle diyebilirsiniz: Ben Aşağıdakilerden herhangi biri çalıştığınızda

gen = WordGenerator.new 

gen['a', 1] = true 
# or explicitly: 
gen.[]=('a', 1, true) 

Fakat tercüman yakınır:

gen.allow('a', 1) = false # syntax error 
gen.allow=('a', 1, false) # syntax error 

Neden bu işe yaramazsa, açık olanı kaçırmıyorum?

+0

ilgili/yinelenen: http://stackoverflow.com/questions/9280623/setter-method-assignment-with-multiple-arguments – kotique

cevap

16

Çözümleyici izin vermediği için işe yaramıyor. identifier = expression, expression.identifier = expression (tanımlayıcı \w+), expression[arguments] = expression ve expression.[]= arguments formlarının ifadelerinde ve bir dize ya da sembol ya da karakter literalinin bir parçası olarak (?=) eşittir işareti kullanılabilir. Bu kadar.

gen.send(:allow=, 'a', 1, false) işe yarar, ancak bu noktada, yönteme bir = içermeyen bir ad verebilirsiniz.

+0

teşekkürler. Komik olan şey, 'def seed = (value) end; gen.seed = (1)'. 'Seed =' tanımlayıcısının olmasını beklerdim, fakat (eğer kurallarınızı doğru olarak anladım) şu şekilde olur: [gen/expr]. [Seed/identifier] = [(1)/expr]. Bu, birden fazla argümanla neden başarısız olduğunu açıklayabilir - (a) bir ifadedir, ancak (a, b) değildir! Bunun geçerli olduğunu varsayarsak, 'gen. [] = (' A ', 1, true)' nasıl çalışır? –

+0

'. [] =', Yukarıdaki listede yer alan bir diğer özel durum (tabii ki ayrıca çalıştığı ifade [comma_seperated_expressions] = expression' ile birlikte). – sepp2k

6

Buna rastladım ve argümanlarımı bir dizi veya karma olarak geçmeye karar verdim.

Örn .:

def allow=(arguments) 
    puts arguments[:letter] 
    puts arguments[:position] 
    puts arguments[:allowed] 
end 

object.allow={:letter=>'A',:position=>3,:allowed=>true}