ruby面试
程序员文章站
2022-05-21 11:03:19
...
Block、Proc 与 Lambda的区别: https://www.jianshu.com/p/8a3b3e22e013
alias 与 alias_method 的区别: http://lazybios.com/2015/11/alias-vs-aliasmethod/
yield self 的用法, 写个例子: https://www.jianshu.com/p/d13b2b26b4d7
Scope实现原理: https://narutohinata.github.io/2017/03/05/ActiveRecord%E9%87%8C%E7%9A%84Scope%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/
require、load、autoload、require_dependency的区别及其使用场景:
require: 引用文件,但是只能引用一次。举个例子,irb中引用b文件,b文件常量Age为35,第一次执行Age为35,然后我们修改b文件常量Age为36,再次引用执行还是35,而load就会是36。
load: 和require类似,但是支持多次引用,如果引用文件的内容变动频繁就用load,这里举个例子,有两个文件,分别是a和b,a引用b,b引用a,如果是使用require执行的时候就不会报错,如果是load执行的时候就会报错。此外a文件有常量Age,引用的b文件也有的话,会报警告信息,这个时候load(b.rb, true)就可以避免常量被污染。
autoload: 只有引用文件的类或者module被使用时才会加载这个文件
require_dependency: 开发环境下如果文件有改动,会自动加载该文件
Object、 Module、 Class、Kernel 解释及其关系:
object是所有类的基类,module是模块除了不能new一个实例外基本上和class一样,他们的关系是 class > module > object
Kernel 是一个module,里面包含了很多方法,而Object包含了这个模块,所以所有的Object的子类都可以使用Kernel的方法,例如nil? puts等。
ruby单例模式如何实现:
require "singleton"
class User
include Singleton
end
User.instance
singleton method(单件方法)、singleton class(单件类) 解释一下:
1) singleton method是指只属于某个对象的方法,其他对象不可以使用,例如先创建一个对象,然后为该对象追加一个方法。
class User
end
user = User.new
class << user
def username
"zhangsan"
end
end
或者
def user.username
def username
"zhangsan"
end
end
puts user.singleton_methods
这里的username方法就是只属于user这个实例的方法
注意: 类方法定义方式如下两种,看起来是不是和singleton method一样,其实类方法的本质就是类的singleton method
class << self
def username
end
end
def User.username
end
2)singleton class(单件类): singleton method不属于class,而是属于singleton class中也就是 如下:
class << obj
def ..
end
end
块解释以及和函数的区别:
块是闭包,通过大括号或者do..end实现,本身也起到类似函数的作用,相对于函数有如下优势:
1)容错设计,如hash={}; hash.fetch('name'){"wo"}
2) DSL语言设计
如何调用私有方法:
send可以调用私有方法
alias 与 alias_method 的区别: http://lazybios.com/2015/11/alias-vs-aliasmethod/
yield self 的用法, 写个例子: https://www.jianshu.com/p/d13b2b26b4d7
Scope实现原理: https://narutohinata.github.io/2017/03/05/ActiveRecord%E9%87%8C%E7%9A%84Scope%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/
require、load、autoload、require_dependency的区别及其使用场景:
require: 引用文件,但是只能引用一次。举个例子,irb中引用b文件,b文件常量Age为35,第一次执行Age为35,然后我们修改b文件常量Age为36,再次引用执行还是35,而load就会是36。
load: 和require类似,但是支持多次引用,如果引用文件的内容变动频繁就用load,这里举个例子,有两个文件,分别是a和b,a引用b,b引用a,如果是使用require执行的时候就不会报错,如果是load执行的时候就会报错。此外a文件有常量Age,引用的b文件也有的话,会报警告信息,这个时候load(b.rb, true)就可以避免常量被污染。
autoload: 只有引用文件的类或者module被使用时才会加载这个文件
require_dependency: 开发环境下如果文件有改动,会自动加载该文件
Object、 Module、 Class、Kernel 解释及其关系:
object是所有类的基类,module是模块除了不能new一个实例外基本上和class一样,他们的关系是 class > module > object
Kernel 是一个module,里面包含了很多方法,而Object包含了这个模块,所以所有的Object的子类都可以使用Kernel的方法,例如nil? puts等。
ruby单例模式如何实现:
require "singleton"
class User
include Singleton
end
User.instance
singleton method(单件方法)、singleton class(单件类) 解释一下:
1) singleton method是指只属于某个对象的方法,其他对象不可以使用,例如先创建一个对象,然后为该对象追加一个方法。
class User
end
user = User.new
class << user
def username
"zhangsan"
end
end
或者
def user.username
def username
"zhangsan"
end
end
puts user.singleton_methods
这里的username方法就是只属于user这个实例的方法
注意: 类方法定义方式如下两种,看起来是不是和singleton method一样,其实类方法的本质就是类的singleton method
class << self
def username
end
end
def User.username
end
2)singleton class(单件类): singleton method不属于class,而是属于singleton class中也就是 如下:
class << obj
def ..
end
end
块解释以及和函数的区别:
块是闭包,通过大括号或者do..end实现,本身也起到类似函数的作用,相对于函数有如下优势:
1)容错设计,如hash={}; hash.fetch('name'){"wo"}
2) DSL语言设计
如何调用私有方法:
send可以调用私有方法
下一篇: 扫码支付宝直接转账到银行卡