Câu hỏi phỏng vấn Ruby
Câu hỏi

What does it mean to coerce an object? Why would you do it?

Câu trả lời

In Ruby, to coerce an object means to explicitly convert it from one type to another, typically to ensure that operations involving different types can be performed without errors. This is particularly relevant in Ruby due to its dynamic type system, where the type of a variable can change at runtime.

Understanding Coercion in Ruby

Ruby provides a method called coerce which is used to handle type coercion. This method is called on an object when Ruby tries to perform an operation involving two different types and it needs them to be of the same type. The coerce method should return an array containing two elements, both of which are the same type, suitable for the operation. The first element of the array is typically the coerced version of the other object, and the second is the coerced version of the object on which coerce was called[1][2].

Practical Examples and Usage

  1. Handling Custom Objects: If you define a custom class and want to perform arithmetic operations with instances of this class and built-in numeric types, you would need to define a coerce method. For example, if you have a Money class and you want to perform operations with Fixnum (an integer class in Ruby), you would define Money#coerce to handle this[1].

    class Money
      def coerce(other)
        [self, other]
      end
    end

    In this example, when you try to perform an operation like 5 * Money.new(100), Ruby will first call Money#coerce(5). The coerce method needs to return [Money.new(5), Money.new(100)], allowing the multiplication to proceed between two Money objects.

  2. Ensuring Correct Operations: Without coercion, operations between different types might lead to errors or incorrect behavior. For instance, trying to multiply a Point object by a number might work (point * 3), but multiplying a number by a Point object (3 * point) won't work unless a coerce method is defined in the Point class to handle this[2].

    class Point
      attr_accessor :x, :y
    
      def initialize(x, y)
      ...
junior

junior

Gợi ý câu hỏi phỏng vấn

senior

What is the difference between BasicObject#instance_eval and BasicObject#instance_exec ?

middle

What is the difference between #== and #equal? ?

junior

Explain each of the following operators and how and when they should be used

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào