2017-01-20 2 views
1
class Tests 
    def self.test1 
    'This is the First' 
    end 

    def self.test2 
    'This is the second' 
    end 
end 
puts Tests.test1.test2 

Я получаю сообщение об ошибкеМетоды класса Ruby, вызывающие его дважды?

undefined method `test2' for "This is the First":String (NoMethodError). 

Я предполагаю, что его не представляется возможным назвать второй метод класса. Однако я делаю кодирование чего-то, что говорит мне, что это возможно. Может ли кто-нибудь подтвердить или помочь исправить это?

+0

Это называется «свободный интерфейс», поэтому ссылка на сообщение в блоге, где это было популяризировано, и исторический контекст моего ответа. – akuhn

ответ

2

Если вы возвращаете self от каждого метода, вы можете приковать их бесконечное количество раз :)

Примечания: Я добавил puts к каждому методу, так как в противном случае весь метод будет делать возвращается self.

class Tests 
    def self.test1 
    puts 'This is the First' 
    self 
    end 

    def self.test2 
    puts 'This is the second' 
    self 
    end 
end 

Tests.test1.test2 
#=> This is the First 
#=> This is the second 

В основном вы выполняете определенную логику в методе, и когда это будет сделано, вы не возвращать сам объект, так что каждый прикован вызов метода вызывается на объект, а не на результат предыдущего метода (если бы не было self).

+2

Спасибо, положив себя в конце, позвольте мне связать методы вызова, что на самом деле то, что я хотел (не знал, что то, что я хотел в то время). – Hayasama

+0

@ Hayasama note, что я добавил 'puts' к каждому методу, потому что в противном случае все методы будут делать это' self'. Рад помочь, не забудьте принять ответ, так как он сработал (найдите галочку под номером ответа) –

1

Невозможно с этими определениями; вы определяете два класса в классе Tests. Это эквивалентно код:

string = Tests.test1 
# => string = "This is the First" 
string.test2 
# => (undefined method) 

Поскольку test2 не определен на String классе, вы получите ошибку undefined method 'test2' for (...):String.

-1

Не совсем уверен, почему вы хотите связать вызовы методов здесь, вы можете вызвать их отдельно.

Tests.test1 
=> "This is the First" 

Tests.test2 
=> "This is the second" 

короткое описание ошибки, первый метод test1 возвращает строку, которая не имеет какого-либо метода test2, определяемого в нем, что приводит к

ошибки неопределенный метод `test2' для«Это является первым ": String (NoMethodError)

2

Похоже, вы пытаетесь построить„свободно интерфейс“

Основная идея заключается в том, что когда все методы объекта возвращают self, тогда они могут быть соединены вместе без повторения приемника. Эта идея была популяризирована Мартином Цветом в этом сообщении блога, но полностью возвращается к синтаксису цепочки чисел Smalltalk ;.

Это не имеет никакого отношения к методам класса собственно и работает точно так же, как для методов экземпляра. Вот пример, который передает цепочку от класса к экземпляру.

class Lorem 
    def self.ipsum 
    Lorem.new # passing the change from class to instance side 
    end 
    def dolor 
    self 
    end 
    def sit 
    self 
    end 
    def amet 
    self 
    end 
end 

Lorem.ipsum.dolor.sit.amet 
+0

Не знал, что это называется 'Свободный интерфейс', +1 !. Постскриптум В Ruby нет 'методов класса', я уверен, что вы знаете - это все методы экземпляра :) –

+0

@andreydeineko hahaha! – akuhn

+0

Метод каскадирования Smalltalk (';') больше похож на 'Lorem.ipsum.tap (&: dolor) .tap (&: sit) .tap (&: amet)' - он не требует методов возврата получателя , – Stefan

Смежные вопросы