루비 인터뷰 질문

이 게시물에서는 중급 개발자를 위한 Ruby 기본 사항 모음을 만들었습니다.

일반적인 경우 면접관은 미리 준비된 일련의 작업을 가지고 있습니다. 다른 사람들은 기술적인 질문과 혼합된 경험에 대한 대화를 선호합니다. 반면에 일부 회사는 소프트 스킬에 가장 관심을 가집니다. 그러나 이들 모두는 한 가지를 올바르게 이해하고 있습니다. 인터뷰는 비용이 많이 드는 과정입니다. 모든 기업은 비용 절감을 원합니다.

많은 회사를 인터뷰한 후 지원자는 최신 애플리케이션이 구축되는 기본 원칙을 알고 적용할 수 있어야 한다는 것을 이해했습니다. 제 실무에서는 첫 번째 오답으로 면접이 끝나는 경우는 없었지만 미리 이해해야 할 기본 사항이 있습니다.

주니어 개발자는 어떤 식으로든 프로그래밍 언어에 얽매이지 않지만 시니어 개발자는 더 복잡한 코드를 작성할 수 있습니다. 그런 다음 힌트 없이 이러한 문제를 해결할 수 있다면 중간 위치에 대한 실질적인 준비는 대부분 통과되며 면접을 준비하는 동안 다른 주제에 집중할 수 있습니다.

1. Array#map 메소드 구현



가능한 대답


class Array
  def map
    return unless block_given?

    result = []
    i = 0

    while self[i] do
      result << yield(self[i])
      i += 1
    end

    result
  end
end

사용량 확인

[1,2,3,4].map { |x| x * 10 }





2. attr_accessor 메소드 구현



가능한 대답


module AttrAccessor
  def self.included(klass)
    klass.extend(ClassMethods)
  end

  module ClassMethods
    def custom_attr_accessor(*args)
      args.each do |arg|
        define_method(arg) do
          self.instance_variable_get("@#{arg}")
        end

        define_method("#{arg}=") do |value|
          self.instance_variable_set("@#{arg}", value)
        end
      end
    end
  end
end

사용량 확인

class Car
  include AttrAccessor
  custom_attr_accessor :wheels_count, :driver_name
end

car = Car.new
car.wheels_count = 4
car.wheels_count

car.driver_name = 'Kevin'
car.driver_name





3. if 를 제거하여 코드를 리팩터링합니다.




class HtmlFormatter
  def initialize(body)
    @body = body
  end

  def to_s
    "<body>#{@body}</body>"
  end
end

class JsonFormatter
  def initialize(body)
    @body = body
  end

  def to_s
    "{ body: #{@body} }"
  end
end

class Text
  def initialize(body)
    @body = body
  end

  def formatted(type=nil)
    if type == :json
      JsonFormatter.new(@body)
    elsif type == :html
      HtmlFormatter.new(@body)
    else
      raise 'an unknown format type'
    end
  end
end



가능한 대답


class Text
  def initialize(body, formatter)
    @body = body
    @formatter = formatter
  end

  def formatted
    @formatter.render(@body)
  end
end

class BaseFormatter
  def render(text)
    raise 'Not implemented :render method'
  end
end

class HtmlFormatter < BaseFormatter
  def render(text)
    "<body>#{text}</body>"
  end
end

class JsonFormatter < BaseFormatter
  def render(text)
    "{ body: #{text} }"
  end
end

class XmlFormatter < BaseFormatter
end

사용량 확인

text = Text.new('Text', JsonFormatter.new)
puts text.formatted





4. 명령 (1..10).select(&3)이 [3, 6, 9]를 반환하는 데 도움이 되는 코드를 작성합니다.



가능한 대답


class Fixnum
  def to_proc
    Proc.new { |item| item % self == 0 }
  end
end



5. 코드가 있습니다




class Post
  attr_reader :state, :title, :body

  def initialize(title, body)
    @title = title
    @body = body
    @state = :draft
  end

  def publish!
    @state = :published if @state == :draft
  end

  def delete!
    @state = :deleted if @state == :published
  end
end


Post 인스턴스의 속성을 변경할 수 있는 Post 클래스의 기능을 확장합니다.
예: Post.new.force_title('An awesome article') 정확할 것입니다.

가능한 대답


module Forceable
  def method_missing(method, *args, &block)
    if method =~ /force_(\w+)/ && previous_value = self.instance_variable_get("@#{$1}")
      self.instance_variable_set("@#{$1}", args.first)

      puts "Post changes #{$1} value from #{previous_value} to #{args.first}"
    else
      super
    end
  end
end

Post.include(Forceable)

사용량 확인

post = Post.new('Title', 'Body')
post.force_state(:draft)
p post.state

좋은 웹페이지 즐겨찾기