📅  最后修改于: 2023-12-03 15:29:12.300000             🧑  作者: Mango
作为一名Ruby程序员,面试是我们晋升和找工作的必由之路。下面为大家整理了65个常见的Ruby面试题,希望能够对大家有所帮助。
Ruby的命名规范遵循驼峰式写法,类名和模块名以大写字母开头,方法名和变量名以小写字母开头,多个单词使用大写字母隔开,例如:ClassName
、MethodName
、variable_name
。
undefined
表示一个未定义的变量或方法。nil
表示一个空对象。false
表示一个假值。在Ruby中只有 nil
和 false
是假值,其它对象都是真值。符号是Ruby中的一种特殊对象,它用于表示名称或标识符。符号以冒号开头,例如::name
、:id
。符号通常用作键名,因为它们比字符串更快和更节省内存。
def 方法名(参数1, 参数2, ...)
# 方法体
return 返回值
end
在方法的参数列表中,使用*
来表示可变参数,例如:
def method_name(param1, param2, *params)
# 方法体
end
||=
运算符可以用来定义变量的默认值,如果变量已经有值,则不会被重复赋值。例如:
x ||= 1 # 如果x没有值,则赋值为1
递归方法是指在方法内部调用自身的方法。在实现递归方法时需要注意堆栈溢出的问题。
Lambda是一种匿名函数,它可以在调用时动态地创建。Lambda表达式以 lambda
或 ->
开头,例如:
lam = lambda { |param| puts "hello #{param}" }
class ClassName
# 类的定义
end
使用new
方法来创建一个Ruby对象,例如:
object = ClassName.new
实例变量是指每个对象独有的变量,只能在对象内部访问。实例变量以@
符号开头,例如:
class ClassName
def initialize(param)
@param = param
end
end
访问器用于读取对象的属性,设置器用于设置对象的属性。在Ruby中,可以使用attr_accessor
来定义访问器和设置器,例如:
class ClassName
attr_accessor :name
end
使用<
符号继承一个类,例如:
class ChildClassName < ParentClassName
# 类的定义
end
array = [1, 2, 3]
使用<<
符号或push
方法来添加元素,例如:
array << 4
array.push(5)
使用delete
方法来删除数组中的一个元素,例如:
array.delete(3)
使用index
方法来找到一个元素的位置,例如:
array.index(2)
使用sort
方法来排序数组中的元素,例如:
array.sort
hash = {"key1" => "value1", "key2" => "value2"}
使用[]=
方法来添加一个键值对,例如:
hash["key3"] = "value3"
使用delete
方法来删除一个键值对,例如:
hash.delete("key2")
使用[]
方法来查找键的值,例如:
hash["key1"]
使用keys
方法来获取所有的键,使用values
方法来获取所有的值,例如:
hash.keys
hash.values
str = "hello world"
使用#{}
语法来插入一个变量或表达式的值,例如:
name = "ruby"
puts "hello #{name}"
使用gsub
方法来进行替换,例如:
str.gsub("world", "ruby")
使用index
方法来查找子字符串的位置,例如:
str.index("world")
使用\
符号来转义特殊字符,例如:
str = "hello \"ruby\""
Ruby中用于迭代的方法有:each
、map
、select
、reject
、reduce
等。
each
方法进行迭代?array.each { |item| puts item }
map
方法进行迭代?array.map { |item| item * 2 }
select
方法进行迭代?array.select { |item| item > 3 }
闭包是指一个可以访问其它作用域中变量的代码块,例如:
def counter
count = 0
lambda { count += 1 }
end
c = counter
puts c.call #=> 1
puts c.call #=> 2
puts c.call #=> 3
使用begin
/rescue
/ensure
/end
块来处理异常,例如:
begin
# 可能会出现异常的代码
rescue Exception => e
puts e.message
puts e.backtrace.inspect
ensure
# 无论是否出现异常,都要执行的代码
end
异常类是一种特殊的类,用于表示运行时错误。
Ruby中的异常分为标准异常和自定义异常。
继承Exception
类来定义一个自己的异常,例如:
class MyException < Exception
end
在Ruby中,异常以栈的形式传播,一旦抛出异常,程序就会沿着栈回溯,直到找到一个处理该异常的地方或程序结束。
使用File.open
方法打开一个文件,例如:
File.open("filename", "r") do |file|
# 文件处理
end
使用File.read
方法读取一个文件,例如:
file = File.read("filename")
puts file
使用File.write
方法向一个文件写入内容,例如:
File.write("filename", "content")
使用File.foreach
方法循环遍历文件中的每一行,例如:
File.foreach("filename") do |line|
puts line
end
使用File.unlink
方法删除一个文件,例如:
File.unlink("filename")
使用/.../
符号来创建一个正则表达式,例如:
pattern = /hello/
使用match
方法来进行正则表达式匹配,例如:
str = "hello world"
pattern = /hello/
if pattern.match(str)
puts "Matched!"
end
使用|
符号把多个模式拼接到一起,例如:
pattern = /hello|world/
使用gsub
方法,例如:
str.gsub(pattern, "ruby")
默认情况下,Ruby中的正则表达式是区分大小写的。如果需要不区分大小写的匹配,可以在正则表达式后面加上/i
选项,例如:
pattern = /hello/i
Ruby中常用的编码相关库有:iconv
、nkf
、rspec
等。
Ruby中常用的字符串处理库有:ActiveSupport::Inflector
、Stringex
、Text
等。
Ruby中常用的日期和时间处理库有:Date
、Time
、Chronic
、ActiveSupport::TimeZone
等。
Ruby中常用的Web相关库有:Rails
、Sinatra
、Rack
、Nokogiri
等。
Ruby中常用的数据库访问库有:ActiveRecord
、DataMapper
、Sequel
、mysql2
等。
可以使用ObjectSpace.memsize_of_all
方法来查看一个对象的内存使用情况,例如:
puts ObjectSpace.memsize_of_all
使用GC.start
方法手动启动一次垃圾回收,例如:
GC.start
使用ruby-prof
库来分析Ruby程序的性能瓶颈,例如:
require 'ruby-prof'
result = RubyProf.profile do
# 进行性能测试的代码
end
printer = RubyProf::FlatPrinter.new(result)
printer.print(STDOUT)
使用Rails.cache
、Dalli
和memcached
等缓存库来进行缓存优化。
使用EventMachine
和NIO
等库来进行异步处理,例如:
require 'eventmachine'
EM.run do
# 异步处理的代码
end
使用Socket
类来进行Socket编程,例如:
require 'socket'
server = TCPServer.new(8888)
loop do
Thread.start(server.accept) do |client|
client.puts "Hello World"
client.close
end
end
使用net/http
库来进行HTTP编程,例如:
require 'net/http'
uri = URI('http://example.com/path')
res = Net::HTTP.get(uri)
puts res
常用的Ruby网络框架有:Ruby on Rails
、Sinatra
、Padrino
、Grape
等。
使用rails new
命令来创建一个新的Ruby on Rails项目,例如:
rails new myapp
使用rails generate controller
命令来生成一个控制器,例如:
rails generate controller Hello