开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情
[1] 什么是 Ruby 中的单例方法,如何定义它?
单例方法是在对象的单个实例上定义的方法,而不是在整个对象的类上定义的方法。要定义单例方法,您可以使用 define_singleton_method 方法并将方法名称和定义方法行为的代码块传递给它。下面是一个定义单例方法的例子:
dog = Dog.new("Fido") def dog.bark puts "Woof!" end dog.bark # outputs "Woof!" 复制代码
[2] 什么是 Ruby 中的元编程,它是如何工作的?
Ruby 中的元编程指的是编写可以在运行时生成或修改其他代码的代码的能力。这是通过使用各种元编程技术实现的,例如 method_missing、define_method 和 eval。以下是使用 define_method 方法在运行时定义新方法的示例:
class Dog def self.define_bark(breed) define_method(:bark) do puts "Woof! I am a #{breed}." end end end Dog.define_bark("Labrador") dog = Dog.new dog.bark # outputs "Woof! I am a Labrador." 复制代码
[3] 什么是 Ruby 中的模块,如何使用它们?
Ruby 中的模块是可以包含在类中的方法和常量的集合。模块用于在不需要继承的情况下为类提供附加功能。要在类中包含模块,可以使用 include 关键字,后跟模块名称。下面是一个使用模块的例子:
module Barkable def bark puts "Woof!" end end class Dog include Barkable end dog = Dog.new dog.bark # outputs "Woof!" 复制代码
[4] Ruby 中如何实现观察者模式?
观察者模式是一种设计模式,其中对象(主题)维护依赖项(观察者)列表并在其状态更改时通知它们。要在 Ruby 中实现观察者模式,可以使用 Observer 库,它提供了一组用于创建观察者和主题的类和方法。以下是使用 Observer 库的示例:
require 'observer' class Dog include Observable def bark changed notify_observers("barking") end end class Owner def update(event) puts "Dog is #{event}." end end dog = Dog.new owner = Owner.new dog.add_observer(owner) dog.bark # outputs "Dog is barking." 复制代码
[5] Ruby中类变量和类实例变量有什么区别?
Ruby 中的类变量是在类的所有实例之间共享的变量。它是用@@ 符号定义的,并且可用于该类的所有方法。下面是一个使用类变量的例子:
class Dog @@num_dogs = 0 def initialize @@num_dogs += 1 end def self.num_dogs @@num_dogs end end dog1 = Dog.new dog2 = Dog.new puts Dog.num_dogs # outputs 2 复制代码
另一方面,类实例变量是特定于类的特定实例的变量。它是用@符号定义的,并且只对实例的方法可用。下面是一个使用类实例变量的例子:
class Dog def initialize(name) @name = name end def greet puts "Hello, my name is #{@name}!" end end dog1 = Dog.new("Fido") dog1.greet # outputs "Hello, my name is Fido!" dog2 = Dog.new("Buddy") dog2.greet # outputs "Hello, my name is Buddy!" 复制代码
[6] Ruby中的freeze和seal方法有什么区别?
Ruby 中的 freeze 方法用于防止对象被修改。一旦对象被冻结,任何修改它的尝试都会引发 RuntimeError。另一方面,密封方法用于防止对象被修改或扩展。它可以被认为是冻结方法的更严格版本。这是使用冻结和密封方法的示例:
string = "hello" string.freeze string << " world" # raises a RuntimeError array = [1, 2, 3] array.seal array << 4 # raises a RuntimeError 复制代码
[7] Ruby 中惰性枚举器和常规枚举器有什么区别?
Ruby 中的惰性枚举器是一种按需生成其值的枚举器,而不是预先生成所有值。这对于处理大型数据集或仅需要一部分值时非常有用。另一方面,常规枚举器会预先生成所有值。要在 Ruby 中创建惰性枚举器,可以使用 Enumerator 类的惰性方法。下面是一个使用惰性枚举器的例子:
lazy_enumerator = (1..Float::INFINITY).lazy.select { |n| n % 2 == 0 } lazy_enumerator.take(5).to_a # outputs [2, 4, 6, 8, 10] 复制代码
[8] 什么是 Ruby 中的 method_missing 以及如何使用它?
Ruby 中的 method_missing 方法是一种特殊的方法,当对不存在的对象调用方法时调用。它允许您定义自定义行为来处理缺失的方法。要使用 method_missing,您在类中定义一个 method_missing 方法,并使用 super 关键字调用原始 method_missing 方法。下面是一个使用 method_missing 的例子:
class Dog def bark puts "Woof!" end def method_missing(method_name, *arguments, &block) if method_name == :fetch puts "Fetching the ball!" else super end end end dog = Dog.new dog.bark # outputs "Woof!" dog.fetch # outputs "Fetching the ball!" dog.sit # raises a NoMethodError 复制代码
在此示例中,method_missing 方法用于处理在狗对象上调用的 fetch 方法。如果该方法不是 fetch,则使用 super 关键字调用原始 method_missing 方法,如果该方法不存在则引发 NoMethodError。
[9] Ruby 中的 proc 和 lambda 有什么区别?
Ruby 中的 proc 是一段代码,可以存储在变量中并像对象一样传递。它是使用 proc 关键字或 Proc.new 方法创建的。lambda 类似于 proc,但它对参数检查和返回行为有更严格的规则。它是使用 lambda 关键字或 -> 运算符创建的。这是使用 proc 和 lambda 的示例:
proc = proc { |x| puts x } proc.call(1) # outputs 1 lambda = ->(x) { puts x } lambda.call(1) # outputs 1 复制代码
[10] Ruby中的map和collect方法有什么区别?
Ruby 中的 map 和 collect 方法都用于转换项目集合,方法是将代码块应用于每个项目并返回包含转换项目的新集合。这两种方法的主要区别在于,map 返回一个新数组,而 collect 返回一个与原始集合相同类型的新对象。以下是使用 map 和 collect 方法的示例:
array = [1, 2, 3] new_array = array.map { |x| x * 2 } # new_array is [2, 4, 6] hash = { a: 1, b: 2, c: 3 } new_hash = hash.collect { |k, v| [k, v * 2] }.to_h # new_hash is { a: 2, b: 4, c: 6 } 复制代码