Ruby 模仿 ES6 的简洁属性表示法

42thcoder · 发布于 2016年3月23日 · 最后由 mizuhashi 回复于 2016年3月24日 · 828 次阅读
6764

es6 中有个很实用的语法糖: 允许直接写入变量和函数,作为对象的属性和方法。

var foo = 'bar';
var baz = {foo};
baz // {foo: "bar"}

// 等同于
var baz = {foo: foo};

尝试用 Ruby 模拟了一下, 语法不太漂亮, 大家给点意见.

class TwinHash
  def self.call(&block)
    context, *array = yield

    Hash.new.tap do |hash|
      array.each do |ele|
        hash[ele] = context.local_variable_get(ele)
      end
    end
  end
end

class Array
  def to_hash(context)
    Hash.new.tap do |hash|
      each do |ele|
        hash[ele] = context.local_variable_get(ele)
      end
    end
  end
end



a_long_key_i_do_not_want_to_type_twice = 'test'
key = 'another one'


# 正常写法 
{ a_long_key_i_do_not_want_to_type_twice: a_long_key_i_do_not_want_to_type_twice, key: key }

# 模拟 es6
TwinHash.call{ [binding, :a_long_key_i_do_not_want_to_type_twice, :key] }

# 更少单词
%i(a_long_key_i_do_not_want_to_type_twice key).to_hash(binding)


# 输出结果
=> {:a_long_key_i_do_not_want_to_type_twice=>"test", :key=>"another one"}
共收到 2 条回复
7907

有没有办法不传入binding

23529

太麻烦了,直接可以做成 t{a; b}这样

set_trace_func拿binding,eval一下就可以了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册