OpalRB忽略编译指令

时间:2014-06-12 19:02:47

标签: opalrb

我正在构建一个应用程序,既可以作为独立应用程序托管,也可以在Web浏览器中运行。这意味着某些类应该以不同的方式实现(但以相同的方式使用)。例如:

If OPAL_RB
  require 'javascript_aware_lib'
else
  require 'native_lib'
end

问题是,Ruby将在运行时对此进行评估,但Opal将在编译时对其进行评估。如果不是这样,我可以简单地使用救援条款:

begin   
  RUBY_ENGINE_VERSION
  #opal requires goes here
rescue
  # MRI Ruby requires goes here 
end

所以,简单地说:是否有任何指令或解决办法让Opal不评估代码块?感谢。

2 个答案:

答案 0 :(得分:0)

使用unless RUBY_ENGINE == 'opal',它在编译时实际被跳过。这使得跳过不支持的语法也很有效。 <!{1}},ifelse也受支持。

示例:

RUBY_PLATFORM

一些相关代码(好奇的)

处理AST的编译器:https://github.com/opal/opal/blob/ef570e3ddde9bddc48cc0f94c00e80576140850f/lib/opal/nodes/if.rb#L10-L15

更改日志:https://github.com/opal/opal/blob/8a023f057799fd68fecb3371b52950c7392d469c/CHANGELOG.md#060-2014-03-05

规格:https://github.com/opal/opal/blob/0aef3c6c7a5db8ff86c8f786a5ea6885ea2b12dc/spec/cli/compiler_spec.rb#L86-L121

答案 1 :(得分:0)

我刚发现这段代码

if defined?(Opal) && defined?(File)  
  Opal.append_path File.expand_path('.', File.dirname(__FILE__))
end

this interesting blogpost中为MRI,opalrb和RubyMotion编写cross ruby​​ gems。也可能对你有意思。它使用Opal类的存在来确定ruby解释器。