Πώς να κάνει την τάξη του ιδιωτικού κατασκευαστή σε Ruby;

ψήφοι
46
class A
private
  def initialize
    puts wtf?
  end
end

A.new #still works and calls initialize

και

class A
private
  def self.new
    super.new
  end
end

δεν λειτουργεί εντελώς

Ποιο είναι λοιπόν το σωστό τρόπο; Θέλω να κάνω newιδιωτικά και να το ονομάσουμε μέσω μιας μεθόδου εργοστάσιο.

Δημοσιεύθηκε 14/10/2009 στις 15:18
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
68

Δοκιμάστε αυτό:

class A
  private_class_method :new
end

Περισσότερα για APIDock

Απαντήθηκε 14/10/2009 στις 15:33
πηγή χρήστη

ψήφοι
13

Το δεύτερο κομμάτι του κώδικα που κάνει είναι σχεδόν σωστό. Το πρόβλημα είναι privateλειτουργεί στο πλαίσιο της περίπτωσης μεθόδους αντί των μεθόδων τάξη.

Για να πάρετε privateή private :newνα εργαστούν, το μόνο που χρειάζεται για να το αναγκάσει να είναι στα πλαίσια των μεθόδων κατηγορίας, όπως αυτό:

class A
  class << self
    private :new
  end
end

Ή, αν πραγματικά θέλετε να επαναπροσδιορίσει newκαι κλήσηsuper

class A
  class << self
    private
    def new(*args)
      super(*args)
      # additional code here
    end
  end
end

Μεθόδους εργοστάσιο Class επίπεδο μπορούν να έχουν πρόσβαση στον ιδιωτικό newμια χαρά, αλλά προσπαθεί να υπόσταση σε απευθείας χρήση newθα αποτύχει, επειδή newείναι ιδιωτικό.

Απαντήθηκε 30/09/2015 στις 17:50
πηγή χρήστη

ψήφοι
2

Για να ρίξει φως σχετικά με τη χρήση, εδώ είναι ένα κοινό παράδειγμα της μεθόδου εργοστασίου:

class A
  def initialize(argument)
    # some initialize logic
  end

  # mark A.new constructor as private
  private_class_method :new

  # add a class level method that can return another type
  # (not exactly, but close to `static` keyword in other languages)
  def self.create(my_argument)
     # some logic
     # e.g. return an error object for invalid arguments
     return Result.error('bad argument') if(bad?(my_argument))

     # create new instance by calling private :new method
     instance = new(my_argument)
     Result.new(instance)
  end
end

Στη συνέχεια, το χρησιμοποιούν ως

result = A.create('some argument')    

Όπως ήταν αναμενόμενο, το σφάλμα χρόνου εκτέλεσης συμβαίνει στην περίπτωση της άμεσης newχρήσης:

a = A.new('this leads to the error')
Απαντήθηκε 14/09/2017 στις 15:00
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more