La classe richiedente & # 8220; richiede "mad_skills" & # 8221; o & # 8220; includi "mad_skills" & # 8221 ;?
-
05-07-2019 - |
Domanda
Inoltre, che cosa " self.send attr
" fare? attr
è considerato una variabile di istanza privata della classe ActiveEngineer? Ci sono altri problemi con questo codice in termini di logica Ruby?
class Applicant < ActiveEngineer
require 'ruby'
require 'mad_skills'
require 'oo_design'
require 'mysql'
validates :bachelors_degree
def qualified?
[:smart, :highly_productive, :curious, :driven, :team_player ].all? do
|attr|
self.send attr
end
end
end
class Employer
include TopTalent
has_millions :subscribers, :include=>:mostly_women
has_many :profits, :revenue
has_many :recent_press, :through=>[:today_show, :good_morning_america,
:new_york_times, :oprah_magazine]
belongs_to :south_park_sf
has_many :employees, :limit=>10
def apply(you)
unless you.build_successful_startups
raise "Not wanted"
end
unless you.enjoy_working_at_scale
raise "Don't bother"
end
end
def work
with small_team do
our_offerings.extend you
subscribers.send :thrill
[:scaling, :recommendation_engines, : ].each do |challenge|
assert intellectual_challenges.include? challenge
end
%w(analytics ui collaborative_filtering scraping).each{|task|
task.build }
end
end
end
def to_apply
include CoverLetter
include Resume
end
Soluzione
richiede 'mad_skills'
carica il codice in mad_skills.rb (oppure carica mad_skills.so/.dll a seconda di quale esiste). È necessario richiedere un file prima di poter utilizzare le classi, i metodi ecc. Definiti in quel file (anche se nei binari i file vengono caricati automaticamente quando si tenta di accedere a classi con lo stesso nome del file). Inserendo il requisito all'interno di una definizione di classe, non cambia affatto il suo comportamento (vale a dire metterlo in cima al file non farebbe differenza).
include MadSkills
prende il modulo MadSkills
e lo include nella catena di ereditarietà di Richiedente
, ovvero rende tutti i metodi in MadSkills
disponibile per le istanze di Richiedente
.
self.send attr
esegue il metodo con il nome specificato in attr su self e restituisce il valore restituito. Per esempio. attr = " hello " ;; self.send (attr)
sarà uguale a self.hello
. In questo caso esegue i metodi smart
, altamente_produttivo
, curioso
, driven
e team_player e verifica che tutti restituiscano true.