查看: 2515|回复: 1

[有事请教] 【胡扯】如何充分利用Ruby不打括号的特点

[复制链接]
梦石
0
星屑
163
在线时间
249 小时
注册时间
2014-7-18
回帖
26
发表于 2017-4-15 00:12:05 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 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]


Role Play Games had saved me, but I can never save them.

老黄鸡

梦石
4
星屑
45705
在线时间
7948 小时
注册时间
2009-7-6
回帖
13338

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2017-4-15 09:49:59 | 显示全部楼层
被醋一脸
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部