| 赞 | 0 |
| VIP | |
| 好人卡 | |
| 积分 | 2 |
| 经验 | |
| 最后登录 | 2019-4-8 |
| 在线时间 | 249 小时 |
- 梦石
- 0
- 星屑
- 163
- 在线时间
- 249 小时
- 注册时间
- 2014-7-18
- 回帖
- 26
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 M.Winderic. 于 2017-4-15 21:02 编辑
Ruby有很多特点,如何充分利用Ruby不打括号的特点?【胡扯】
* method
1. method 不用带 `()'
2. method 只能继承,不能引用
3. method 一次性传递全部参数
* lambda
1. lambda 必须带 `[]'
2. lambda 只能引用,不能继承
3. lambda 按顺序挨个传递参数
lazy callback[pre lang="ruby" file="lazy_lambda.rb" line="0"]
#!/usr/bin/env ruby
#coding:utf-8
class FLazyCallback
def func(*parameters, argument: nil, proc_before: nil, proc_after: nil)
return -> *_ {} if argument == :before
return nil if argument == :after
proc_before[*parameters] if proc_before || super(argument: :before)
yield *parameters if block_given?
proc_after[*parameters] if proc_after || super(argument: :after)
end
end
[/pre]
lazy lambda[pre lang="ruby" file="lazy_lambda.rb" line="0"]
#!/usr/bin/env ruby
#coding:utf-8
module RGSSS
module FLazyLambda
def fLazyLambda(n, f, l)
define_method("#{ n }_lambda"){|k=nil, &i|
define_method(n){|*a, &b|
e = "wrong number of arguments (given #{ a.size }, expected #{ k })"
raise ArgumentError.new(e) if k and a.size < k
[f, i, l].each{|z| instance_exec(b, *a, &z) }
}
}
end
end
module LambdaObject
Iarg =-> idx, args { args[idx] }.curry
module ClassMethods
extend FLazyLambda
define_method(:children){ @children }
define_method(:set_children){|hsh| @children = hsh }
fLazyLambda(:initialize,
-> block, *args {
@children = {}
self.class.children.each{|k, l|
@children[k] = l.call(args)
define_singleton_method(k){ @children[k] }
}
},
->*_{}
)
end
module InstanceMethods
end
def self.included(receiver)
receiver.extend ClassMethods
receiver.send :include, InstanceMethods
end
end
module Disposable
module ClassMethods
extend FLazyLambda
fLazyLambda(:dispose, ->*_ { return false if @disposed }, ->*_ { @disposed = true } )
fLazyLambda(:reload, ->*_ {}, ->*_ { @disposed = false } )
end
module InstanceMethods
define_method(:disposed?){ @disposed }
end
def self.included(receiver)
receiver.extend ClassMethods
receiver.send :include, InstanceMethods
end
end
end
[/pre]
|
|