def initialize(apps, catch=404)
@apps = []; @has_app = {}
apps.each { |app| add app }
@catch = {}
[*catch].each { |status| @catch[status] = true }
end
Run Code Online (Sandbox Code Playgroud)
在Rack :: Cascade的这个方法splat(*)中,[*catch]代码服务的目的是什么?
我认为在方法参数中使用了一个splat来指示何时你将有一个未指定数量的参数.
splat在这里有不同的含义吗?
fruit = ["apple","red","banana","yellow"]
=> ["apple", "red", "banana", "yellow"]
Hash[*fruit]
=> {"apple"=>"red", "banana"=>"yellow"}
Run Code Online (Sandbox Code Playgroud)
为什么splat导致数组被如此整齐地解析为Hash?
或者,更确切地说,哈希如何"知道""苹果"是关键而"红色"是它的对应值?
是因为它们在水果阵列中处于连续位置吗?
在这里使用splat是否重要?哈希不能直接从arry定义自己吗?
我对函数式编程知之甚少,但对学习Clojure很感兴趣.
是否有任何函数式语言可以成为理解函数式编程在Clojure中如何工作的一个很好的参考点?
或者Clojure在其函数式编程方法上有多么不同,我最好只关注Clojure的功能特性呢?
是否有任何理由使用块初始化,如下所示:
x = Observer.new do
add_event(foo)
some_other_instance_method_on_observer
self.some_attribute = something
end
Run Code Online (Sandbox Code Playgroud)
而不是在像这样的实例变量上使用点运算符初始化属性:
x = Observer.new
x.add_event(foo)
x.some_other_instance_method_on_observer
x.some_attribute = something
Run Code Online (Sandbox Code Playgroud) 敏捷强调快速迭代而不浪费计划.
MVC强调基于计划架构的关注点分离.
由于非MVC技术需要较少的规划,它们是否更适合敏捷项目?
match, text, number = *"foobar 123".match(/([A-z]*) ([0-9]*)/)
Run Code Online (Sandbox Code Playgroud)
我知道这是在进行某种正则表达式匹配,但是splat在这里扮演什么角色,有没有办法在没有splat的情况下这样做,所以它不那么令人困惑?
如果我的主应用程序文件中有一大堆需求:
require 'a'
require 'b'
require 'c'
require 'd'
require 'e'
require 'f'
require 'g'
require 'h'
require 'i'
require 'j'
Run Code Online (Sandbox Code Playgroud)
将所有这些需要放入条带并将它们放在一个单独的文件中,只需要满足所有要求 - 让我们称之为' all_requires.rb' - 这样我就可以说:
require 'all_requires'
Run Code Online (Sandbox Code Playgroud)
我从未在其他人的代码中看到过这种方法,所以也许是有原因的?
def self.get(server)
return unless server
server = server.to_s
if klass = @handlers[server]
obj = Object
klass.split("::").each { |x| obj = obj.const_get(x) }
obj
else
try_require('rack/handler', server)
const_get(server)
end
end
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,const_get用于在此行上检索某种命名常量:
klass.split("::").each { |x| obj = obj.const_get(x) }
Run Code Online (Sandbox Code Playgroud)
如果是这样,为什么klass特别在这里使用?我读过这个klass用于避免命名空间与" class"关键字冲突.但在这个例子中,我没有看到可能发生冲突的地方.
class Observer
def initialize(&block)
instance_eval(&block) if block_given?
end
end
Run Code Online (Sandbox Code Playgroud)
我想知道在这里假设与'initialize'一起使用的块的类型.
由于调用了instance_eval,这意味着在Observer类的上下文中计算块.
为什么它会这样做,而不是比如说class_eval,以及在类的上下文中评估块的结果可能是什么?
另外,如何调用它?
我很难想象在网络应用程序中实际使用Procs和Lambdas.有没有人在你的代码中有一个他们派上用场的情况的例子?