2016-07-25 5 views
1

Мне было интересно, есть ли самый простой способ избавиться от «я» при вызове функции из другого класса. Пример: у меня есть класс, который имеет функцию.Как и почему я должен избегать использования «self» в объявлении метода Ruby

module Portfolio 
    class Main < Sinatra::Base 

     def self.create_user(username,password,confirm_pass,fullname) 
      @creation_flag = false 
      begin 
       if password == confirm_pass 
        @creation_flag = User.create(username: username,password: password,full_name: fullname).valid? 
       end 
      rescue Exception => e 
       puts 'Error Occured: '+e.message,"" 
      end 
      return @creation_flag 
     end 

     def self. 

    end 
end 

использовать это я должен объявить self.create_user(params goes here) есть способ избавиться от себя ?.

Заранее спасибо.

+1

Если вам нужно объявить метод класса, это лучший способ сделать это. Не волнуйтесь о синтаксисе, это просто означает «определить метод класса» в этом случае. – tadman

+1

ой, я видел проект, который имеет ограниченное использование «я», я не знаю, плохо ли мой код или просто отлично. Кстати, спасибо за мнение. –

+2

Также стоит отметить, что '@ creation_flag' будет сохраняться на протяжении жизни этого класса, что кажется действительно беспорядочным. Это используется где-нибудь еще? Если нет, сделайте его локальной переменной. – tadman

ответ

0

Нет ничего плохого в использовании self, но он обходит требование создания экземпляра переменной вашего объекта, поэтому некоторые программисты с программированием OO предложили бы избегать «я» по этой причине. Если вы избегаете «я», вы вынуждены инициализировать свой класс и назначать ему имя переменной, которое заставляет вас думать о нем как об истинном объекте, а не просто о наборе функций.

Вот пример класса, чтобы продемонстрировать, как вы могли бы назвать методы и без «я»

class StaticVersusObjectMethod 

    def self.class_method 
    puts 'Hello, static class method world!' 
    end 

    def object_method 
    puts 'Hello, object-oriented world!' 
    end 

end 

# No need to create an object instance variable if the method was defined with 'self' 
StaticVersusObjectMethod.class_method 

# You must create an object instance variable to call methods without 'self' 
object = StaticVersusObjectMethod.new 
object.object_method 

выход:

Hello, static class method world! 
Hello, object-oriented world! 

Используете ли вы себя в декларации должна зависеть от вас данных хотите, чтобы ваш метод использовался. Если методы будут , только работают с переменными, которые вы передаете в качестве параметров, а затем используйте «self». С другой стороны, не используйте «я», если вы хотите, чтобы они действовали как истинные методы объекта. Методы объектов «True» могут работать с состоянием переменных класса (полей) в создаваемых вами объектах и ​​назначать одному или нескольким именам переменных.

+0

Спасибо, сэр, сейчас просветлён. –

+0

Кстати, мой главный вопрос заключается в том, как устранить себя при создании функции. –

+0

Джон, обратитесь к последним двум строкам моего примера кода для ответа. Вы можете удалить «я», а затем просто просто вызвать метод на экземпляре объекта класса. В вашем случае создайте объект с «object = Main.new», а затем вызовите «object.create_user» - сделайте это, и вы можете безопасно удалить «self» в своей декларации. На этом этапе его следует называть «методом», а не «функцией». – emery

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

  • Нет связанных вопросов^_^