1

我正在构建一个应用程序,它既可以作为独立应用程序托管,也可以在 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 评估代码块?谢谢。

4

2 回答 2

1

Use unless RUBY_ENGINE == 'opal',它实际上在编译时被跳过。这使得跳过不受支持的语法也很有效。ifelse并且RUBY_PLATFORM也受支持。

例子:

if RUBY_ENGINE == 'opal'
  require 'javascript_aware_lib'
else
  require 'native_lib'
end

一些相关的代码(好奇的)

处理 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

于 2014-06-15T22:00:17.490 回答
0

我刚刚找到了这段代码

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

这篇关于为 MRI、opalrb 和 RubyMotion 编写 cross ruby​​ gems 的有趣博文中。对你来说可能也很有趣。它使用Opal类的存在来确定 ruby​​ 解释器。

于 2014-06-16T02:59:52.370 回答