Caso a classe Requerente “exigem 'mad_skills'” ou “ 'mad_skills' incluem”?
-
05-07-2019 - |
Pergunta
Além disso, o que significa "self.send attr
" fazer? É attr
assumido ser uma variável de instância privada da classe ActiveEngineer? Existem outros problemas com este código em termos de lógica 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
Solução
cargas require 'mad_skills'
o código em mad_skills.rb (ou cargas mad_skills.so/.dll dependendo de qual existe uma). Você precisa exigir um arquivo antes de ser capaz de usar as classes, métodos etc. definidos nesse arquivo (embora em trilhos arquivos são carregados automaticamente quando tentar classes de acesso que têm o mesmo nome do arquivo). Colocando exigem dentro de uma definição de classe, não muda o seu comportamento em tudo (ou seja, colocá-lo no topo do arquivo não faria uma diferença).
include MadSkills
leva a MadSkills
módulo e inclui-lo em cadeia herança de Applicant
, isto é, faz com que todos os métodos em MadSkills
disponível para casos de Applicant
.
self.send attr
executa o método com o nome especificado no attr na auto e retorna seu valor de retorno. Por exemplo. attr = "hello"; self.send(attr)
vai ser o mesmo que self.hello
. Neste caso, ele executa a métodos smart
, highly_productive
, curious
, driven
e team_player
e verifica se todos eles retornar true.