天道酬勤,学无止境

您如何对Ruby代码进行字符串化/序列化?(How do you stringize/serialize Ruby code?)

问题

我希望能够在我的Ruby代码中编写一个lambda / Proc,对其进行序列化,以便可以将其写入磁盘,然后在以后执行该lambda。 有点像...

x = 40
f = lambda { |y| x + y }
save_for_later(f)

后来,在另一次Ruby解释器运行中,我想说...

f = load_from_before
z = f.call(2)
z.should == 42

Marshal.dump不适用于Procs。 我知道Perl有Data :: Dump :: Streamer,在Lisp中这很简单。 但是有没有办法在Ruby中做到这一点? 换句话说,什么是执行save _ for _ later

编辑:下面我的答案很好,但是它不会关闭自由变量(如x )并将它们与lambda一起序列化。 所以在我的例子中...

x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n  (x + y)\n}"

...字符串输出不包含x的定义。 是否有一种解决方案可以考虑到这一点,也许可以通过序列化符号表来解决? 您可以在Ruby中访问它吗?

编辑2 :我更新了我的答案以合并序列化局部变量。 这似乎可以接受。

回答1

使用Ruby2Ruby

def save_for_later(&block)
  return nil unless block_given?

  c = Class.new
  c.class_eval do
    define_method :serializable, &block
  end
  s = Ruby2Ruby.translate(c, :serializable)
  s.sub(/^def \S+\(([^\)]*)\)/, 'lambda { |\1|').sub(/end$/, '}')
end

x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n  (x + y)\n}"
g = eval(s)
# => #<Proc:0x4037bb2c@(eval):1>
g.call(2) 
# => 42

很好,但是它不会关闭自由变量(如x )并将其与lambda一起序列化。

要同时序列化变量,您可以遍历local_variables并对其进行序列化。 但是问题是, save_for_later中的local_variables仅访问上面代码中的cs ,即,序列化代码本地的变量,而不是调用者。 因此,不幸的是,我们必须将对局部变量及其值的获取推送给调用者。

不过,也许这是一件好事,因为总的来说,在一段Ruby代码中查找所有可用变量是不确定的。 另外,理想情况下,我们还将保存global_variables以及任何已加载的类及其覆盖的方法。 这似乎是不切实际的。

使用这种简单的方法,您将获得以下内容:

def save_for_later(local_vars, &block)
  return nil unless block_given?

  c = Class.new
  c.class_eval do
    define_method :serializable, &block
  end
  s = Ruby2Ruby.translate(c, :serializable)
  locals = local_vars.map { |var,val| "#{var} = #{val.inspect}; " }.join
  s.sub(/^def \S+\(([^\)]*)\)/, 'lambda { |\1| ' + locals).sub(/end$/, '}')
end

x = 40
s = save_for_later(local_variables.map{ |v| [v,eval(v)] }) { |y| x + y }
# => "lambda { |y| _ = 40; x = 40;\n  (x + y)\n}"

# In a separate run of Ruby, where x is not defined...
g = eval("lambda { |y| _ = 40; x = 40;\n  (x + y)\n}")
# => #<Proc:0xb7cfe9c0@(eval):1>
g.call(2)
# => 42

# Changing x does not affect it.
x = 7
g.call(3)
# => 43
回答2

使用来净化

这将适用于Ruby 1.8或1.9。

def save_for_later(&block)
  block.to_source
end

x = 40
s = save_for_later {|y| x + y }
# => "proc { |y| (x + y) }"
g = eval(s)
# => #<Proc:0x00000100e88450@(eval):1>
g.call(2) 
# => 42

请参阅我的其他答案以获取自由变量。

更新:现在您还可以使用serializable_proc gem,该gem使用sourcify并捕获局部变量,实例变量,类变量和全局变量。

回答3

查看此问题的答案。

回答4

Ruby具有Marshal类,该类具有可以调用的转储方法。

在这里看看:

http://rubylearning.com/satishtalim/object_serialization.html

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 什么是mixin,为什么它们有用?(What is a mixin, and why are they useful?)
    问题 在“ Python编程”中,Mark Lutz提到了“ mixins”。 我来自C / C ++ / C#背景,以前没有听说过这个词。 什么是mixin? 在本示例的两行之间进行阅读(我已经链接到它,因为它很长),我认为这是使用多重继承来扩展类而不是“适当的”子类的一种情况。 这是正确的吗? 为什么我要这样做而不是将新功能放入子类中? 因此,为什么混合/多重继承方法比使用组合更好? 什么将mixin与多重继承区分开? 这仅仅是语义问题吗? 回答1 mixin是一种特殊的多重继承。 使用mixin的主要情况有两种: 您想为一个类提供很多可选功能。 您想在许多不同的类中使用一种特定功能。 例如,考虑werkzeug的请求和响应系统。 我可以说一个普通的旧请求对象: from werkzeug import BaseRequest class Request(BaseRequest): pass 如果我想添加接受标头支持,我会做到这一点 from werkzeug import BaseRequest, AcceptMixin class Request(AcceptMixin, BaseRequest): pass 如果我想创建一个支持接受标头,etag,身份验证和用户代理支持的请求对象,则可以执行以下操作: from werkzeug import BaseRequest
  • Python中的所有对象都是像Ruby这样的对象吗?(Is everything an object in Python like Ruby?)
    问题 我读到另一个有关Stack Overflow的问题,Python就像Ruby,因为它涉及“一切都是对象”,而Python中的一切都是对象,就像Ruby一样。 这是真的? Python中的所有对象都是像Ruby这样的对象吗? 两者在这方面有何不同?或者它们实际上是相同的吗? 例如,您可以拿一个数字来做我所看到的Ruby事情吗: y = 5.plus 6 可以在Python中以相同的方式完成吗? 回答1 DiveIntoPython-一切都是对象 Python中的所有内容都是对象,几乎所有内容都具有属性和方法。 所有函数都具有内置属性__doc__ ,该属性返回函数源代码中定义的doc string 。 sys模块是一个对象,具有(除其他外)名为path的属性。 依此类推。 尽管如此,这还是个问题。 什么是物体? 不同的编程语言以不同的方式定义“对象”。 在某些情况下,这意味着所有对象都必须具有属性和方法。 在其他情况下,这意味着所有对象都是可子类化的。 在Python中,定义较为宽松; 有些对象既没有属性也没有方法(第3章中有更多介绍),并且并非所有对象都是可子类化的(第5章中有更多介绍)。 但是,从可以将其分配给变量或将其作为参数传递给函数的意义上说,所有事物都是对象(第4章中将对此进行详细介绍)。 Ruby Docs-从Python转换为Ruby 与Python一样
  • Ruby单引号和双引号(Ruby single and double quotes)
    问题 我最近一直在用Ruby进行编码,并且来自Python,据我所知,单引号和双引号对代码的工作方式没有影响。 我搬到Ruby,以了解它是如何工作的,并研究Ruby和Python之间的相似之处。 我曾经使用单引号字符串,并注意到了这一点: hello = 'hello' x = '#{hello} world!' puts x 它返回了'#{hello} world!' 而不是'hello world!' 。 注意到这一点后,我尝试使用双引号将问题解决。 现在我不确定为什么会这样。 单引号和双引号是否会更改此设置,还是因为我的编辑器(Sublime文字3)? 如果在以前的版本中工作方式有所不同,我还将使用Ruby 2.0版。 回答1 在Ruby中,双引号被插入,这意味着#{}的代码被评估为Ruby。 单引号被视为文字(表示不评估代码)。 var = "hello" "#{var} world" #=> "hello world" '#{var} world' #=> "#{var} world" 对于某些特殊的魔术,Ruby还提供了另一种创建字符串的方法: %Q() # behaves like double quotes %q() # behaves like single quotes 例如: %Q(#{var} world) #=> "hello world" %q(#
  • 您如何版本化数据库架构? [关闭](How do you version your database schema? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 1年前关闭。 改善这个问题 您如何准备您的SQL增量? 您是将每个更改架构的SQL手动保存到一个增量文件夹中,还是有某种自动差异化过程? 我对用于对数据库架构和源代码进行版本控制的约定感兴趣。 也许是一个预先提交的钩子,它会与架构有所区别? 此外,除了DbDeploy之外,还有哪些差异差异选项? 编辑:看到答案,我想澄清一下,我熟悉使用增量运行数据库迁移的标准方案。 我的问题是关于自己创建增量,最好是自动创建。 同样,版本控制适用于PHP和MySQL(如果有所帮助)。 (请没有Ruby解决方案)。 回答1 看 是否存在用于数据库结构更改的版本控制系统? 如何在SVN中版本化MS SQL数据库? 和杰夫的文章 使数据库受版本控制 我感到您很痛苦,希望有一个更好的答案。 这可能更接近您想要的东西。 跟踪数据库架构更改的机制 总的来说,我觉得没有足够的,可以接受的解决方案,因此我会在这一领域做出自己的贡献。 回答2 您可能会看到另一个类似的线程:如何在SVN中对MS SQL数据库进行版本控制? 回答3 如果您仍在寻找选项:请看neXtep设计器。 这是一个基于版本控制概念的免费GPL数据库开发环境。 在环境中,您始终使用版本控制的实体
  • 可可依赖注入框架? [关闭](Dependency injection framework for Cocoa? [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 Interface Builder可以用于Cocoa应用程序中的基本依赖项注入,但是当您不想实例化NIB文件中的对象时,有人知道Objective-C / Cocoa的更完整的依赖项注入框架吗? 编辑 需要澄清的是,我认识到IB可以用于基本的DI,但是我正在寻找一个具有更完善功能的框架,包括与Groovy或Springs相似的单独的生产和测试配置。 回答1 我想您会发现,在诸如Objective C,Ruby,Lisp等后期绑定语言中不需要它。 就像贾米斯(Jamis)的启示一样,当他尝试建立针头时,他走的路太复杂了,重新审视了Ruby- Net :: SSH的DI框架。 这里有一些链接,它们有望为您提供一些示例代码,以在Objective C中做类似的事情。使用类别,您可以在运行时实质上改变任何类的行为。 请参阅Mac Developer Tips – Objective-C:类别和有关类别的Cocoa API文档。 本质上,您不需要中央位置来请求可配置的“执行x的操作”,因为您可以直接实例化TheThingThatDoesX
  • 最低有效JSON是多少?(What is the minimum valid JSON?)
    问题 我已经仔细阅读了JSON描述http://json.org/,但是我不确定我是否知道简单问题的答案。 最小可能的有效JSON是什么字符串? "string"是字符串有效的JSON吗? 42简单数字是有效的JSON吗? 布尔值是否是有效的JSON,是否为true ? {}空对象是有效的JSON吗? []空数组是有效的JSON吗? 回答1 在撰写本文时,JSON仅在RFC4627中进行了描述。 它(在“ 2”开头)将JSON文本描述为序列化的对象或数组。 这意味着在符合该标准的解析器和字符串化器中,只有{}和[]是有效的,完整的JSON字符串。 但是,ECMA-404的引入改变了这一点,并且可以在此处阅读更新的建议。 我也写了一篇关于这个问题的博客文章。 然而,令问题进一步JSON.stringify()是,Web浏览器中可用的JSON对象(例如JSON.parse()和JSON.stringify() )在ES5中已标准化,并且明确定义了可接受的JSON文本,如下所示: 本规范中使用的JSON交换格式与RFC 4627完全相同,但有两个例外: ECMAScript JSON语法的顶级JSONText生成可以由任何JSONValue组成,而不是被限制为RFC 4627指定的JSONObject或JSONArray。 抢断 这意味着即使JSON对象在技术上遵循RFC 4627
  • 如何使用Ruby on Rails解析JSON? [复制](How do I parse JSON with Ruby on Rails? [duplicate])
    问题 这个问题已经在这里有了答案: 在Ruby中解析JSON字符串(8个答案) 2年前关闭。 我正在寻找一种解析JSON,提取值并将其写入Rails中的数据库的简单方法。 具体来说,我正在寻找一种从bit.ly API返回的JSON中提取shortUrl的方法: { "errorCode": 0, "errorMessage": "", "results": { "http://www.foo.com": { "hash": "e5TEd", "shortKeywordUrl": "", "shortUrl": "http://bit.ly/1a0p8G", "userHash": "1a0p8G" } }, "statusCode": "OK" } 然后使用该shortUrl并将其写入与长URL关联的ActiveRecord对象。 这是我可以在概念上完全思考的事情之一,当我坐下来执行时,我意识到我需要学习很多东西。 回答1 这些答案有些过时了。 因此,我给你: hash = JSON.parse string Rails的应该会自动加载json模块为你,所以你不需要添加就require 'json' 。 回答2 在Rails中解析JSON非常简单: parsed_json = ActiveSupport::JSON.decode(your_json_string) 让我们假设
  • 如何使用Ruby对输出到终端的文本进行着色? [关闭](How can I use Ruby to colorize the text output to a terminal? [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 5年前关闭。 改善这个问题 使用Ruby,如何在终端中对输出的背景和前景文本进行着色? 我记得,在对Pascal进行编程时,我们所有人都曾经编写自己的textcolor(…)程序,以使我们的小型教育程序看起来更美观,更具表现力。 我将如何在Ruby中编写与之等效的代码? 核心库中是否有任何内置支持可用于此目的? 如果没有,添加它的惯用方式是什么? 回答1 上色是我最喜欢的宝石! :-) 看看这个: https://github.com/fazibear/colorize 安装: gem install colorize 用法: require 'colorize' puts "I am now red".red puts "I am now blue".blue puts "Testing".yellow 回答2 结合以上答案,您可以实现类似gem colorize的功能,而无需其他依赖项。 class String # colorization def colorize(color_code) "\e[#{color_code}m#{self}\e[0m" end def red colorize(31) end def green
  • 参数化SQL IN子句(Parameterize an SQL IN clause)
    问题 我该如何参数化包含一个带有可变数量参数的IN子句的查询,例如这个? SELECT * FROM Tags WHERE Name IN ('ruby','rails','scruffy','rubyonrails') ORDER BY Count DESC 在此查询中,参数的数量可以在1到5之间的任何位置。 我不希望为此(或XML)使用专用的存储过程,但是如果有一些特定于SQL Server 2008的优雅方法,我可以接受。 回答1 这是我使用的一种快速而又肮脏的技术: SELECT * FROM Tags WHERE '|ruby|rails|scruffy|rubyonrails|' LIKE '%|' + Name + '|%' 因此,这是C#代码: string[] tags = new string[] { "ruby", "rails", "scruffy", "rubyonrails" }; const string cmdText = "select * from tags where '|' + @tags + '|' like '%|' + Name + '|%'"; using (SqlCommand cmd = new SqlCommand(cmdText)) { cmd.Parameters.AddWithValue("@tags", string
  • 如何使用JSON对JavaScript日期进行字符串化并保留时区(How to JSON stringify a javascript Date and preserve timezone)
    问题 我有一个由用户创建的日期对象,浏览器填写了时区,如下所示: var date = new Date(2011, 05, 07, 04, 0, 0); > Tue Jun 07 2011 04:00:00 GMT+1000 (E. Australia Standard Time) 不过,当我将其字符串化时,时区会再见 JSON.stringify(date); > "2011-06-06T18:00:00.000Z" 我可以在保留浏览器时区的同时获取ISO8601字符串的最佳方法是使用moment.js并使用moment.format() ,但是,如果我要通过使用JSON.stringify东西来序列化整个命令,那当然是行不通的JSON.stringify在内部进行JSON.stringify (在本例中为AngularJS) var command = { time: date, contents: 'foo' }; $http.post('/Notes/Add', command); 为了完整起见,我的域确实需要本地时间和偏移量。 回答1 假设您有某种包含Date的对象: var o = { d : new Date() }; 您可以覆盖Date原型的toJSON函数。 在这里,我使用moment.js从日期创建一个moment对象,然后使用不带参数的矩的format函数
  • 安全服务/渗透测试工程师_面试题之OWASP TOP 10
    欢迎关注我的微信公众号:安全攻防渗透 信息安全领域原创公号,专注信安领域人才培养和知识分享,致力于帮助叁年以下信安从业者的学习和成长。 思考了很长时间,最近一直在准备安全服务工程师的面试题,说到底还是自己学的不够扎实,理解的不够深刻,想到CSDN可以写笔记,还能跟大家一同分享,就渐渐的喜欢上了这里。 持续更新 自我介绍 首先肯定是一段必不可少的自我介绍,时间大约为 3 min。 这一段必须要好好打磨,不可马虎,意简言赅(gai)。 正文 OWASP TOP 10 2020有哪些? 注入 失效身份验证和会话管理 敏感信息泄露 XML外部实体注入攻击(XXE) 访问控制中断 安全性错误配置 跨站脚本攻击(XSS) 不安全的反序列化 使用具有已知漏洞的组件 日志记录和监控不足 0x00 注入 当攻击者将无效的数据发送给web应用程序来让其执行为设计的操作,就会发生代码注入问题。 此安全漏洞最常见的示例便是使用不受信任数据的SQL查询。代码注入漏洞的核心是缺乏对web应用程序使用的数据的验证和清理。任何接受参数作为输入的内容都可能受到代码注入攻击。 危害: 注入可以使数据丢失或者被破坏掉,并且缺乏可审计性或者拒绝服务。注入漏洞有时甚至可导致完全接管主机。 如何进行防御代码注入漏洞 首选方法是使用安全的API接口,该API避免完全使用解释器,或者说提供参数化的接口或迁移为使用对象关系映射工具
  • 如何避免ASP.NET应用程序中的SQL注入攻击?(How can I avoid SQL injection attacks in my ASP.NET application?)
    问题 我需要避免在ASP.NET应用程序中容易受到SQL注入的攻击。 我该怎么做? 回答1 即使您的问题很笼统,也始终遵循一些规则: 使用参数化查询(带有SqlParameter SqlCommand ),并将用户输入放入参数中。 不要从未经检查的用户输入中构建SQL字符串。 不要以为您可以建立一个清理例程,该例程可以检查用户输入的各种格式错误。 边缘盒很容易被遗忘。 检查数字输入可能很简单,可以使您安全起见,但是对于字符串输入,只需使用参数即可。 检查第二级漏洞-如果这些值由用户输入组成,则不要从SQL表值中构建SQL查询字符串。 使用存储过程来封装数据库操作。 回答2 使用预处理语句(链接到ASP.NET教程,该教程在“为产品添加节点”部分中使用预处理语句)。 这里的所有都是它的。 嗯,或者使用ORM(例如Linq to SQL或NHibernate),它们在内部使用准备好的语句。 回答3 使用参数! 真的就是这么简单:-) 像这样创建查询(对于使用C#的MS Sql服务器): SqlCommand getPersons = new SqlCommand("SELECT * FROM Table WHERE Name = @Name", conn); 在这里,@Name是要避免SQL注入的参数,conn是SqlConnection对象。 然后,要添加参数值,请执行以下操作:
  • String#encode无法修复“ UTF-8中无效的字节序列”错误(String#encode not fixing “invalid byte sequence in UTF-8” error)
    问题 我知道关于此错误有多个类似的问题,并且我尝试了很多运气不佳的问题。 我遇到的问题涉及字节\xA1并抛出 ArgumentError:UTF-8中的无效字节序列 我已经尝试了以下方法,但均未成功: "\xA1".encode('UTF-8', :undef => :replace, :invalid => :replace, :replace => "").sub('', '') "\xA1".encode('UTF-8', :undef => :replace, :invalid => :replace, :replace => "").force_encoding('UTF-8').sub('', '') "\xA1".encode('UTF-8', :undef => :replace, :invalid => :replace, :replace => "").encode('UTF-8').sub('', '') 每行都会为我抛出错误。 我究竟做错了什么? 更新: 以上几行仅在IRB中失败。 但是,我修改了我的应用程序,以使用相同的String#encode方法和参数对CVS文件的行进行编码,并且从文件中读取行时遇到了相同的错误(注意:如果您对同一字符串执行操作,该行将起作用不使用IO)。 bad_line = "col1\tcol2\tbad\xa1" bad
  • 您如何设计面向对象的项目? [关闭](How do you design object oriented projects? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 改善这个问题 我正在为一个大型项目工作(对我来说),该项目将有许多类并且需要可扩展,但是我不确定如何计划程序以及各类之间的交互方式。 我上了几个学期的OOD课程,并从中学到了很多东西。 例如编写UML,以及将需求文档转换为对象和类。 我们也学习了顺序图,但是以某种方式我错过了讲座或其他内容,它们并没有真正与我保持一致。 在以前的项目中,我尝试使用从本课程中学到的方法,但是通常最终得到的代码是,只要我能说“是的,看起来像我的想法”,我就不希望深入了解新的功能。 我得到了史蒂夫·麦康奈尔(Steve McConnell)的《代码完成》的副本,在这里和其他地方,我一直听到我很惊讶。 我阅读了有关设计的章节,但似乎没有得到我所寻找的信息。 我知道他说这不是一成不变的过程,它主要是基于启发法,但是我似乎无法吸收他的所有信息并将其应用于我的项目。 那么,在高层设计阶段(开始编程之前)要做什么以确定您需要什么类(尤其是那些不基于任何“现实世界对象”的类)以及它们将如何相互影响? 我特别对您使用的方法感兴趣? 您遵循的过程通常会形成一个良好,干净的设计来紧密代表最终产品的流程是什么? 回答1 我用于初始设计的步骤(进入类图)是: 需求收集。
  • 如何使用JavaScript对包含换行符的JSON字符串进行转义?(How to escape a JSON string containing newline characters using JavaScript?)
    问题 我必须形成一个JSON字符串,其中的值具有换行符。 必须对此进行转义,然后使用AJAX调用将其发布。 任何人都可以提出一种使用JavaScript转义字符串的方法。 我没有使用jQuery。 回答1 使用您的JSON和.stringify() 。 然后使用.replace()方法,并将所有\n替换为\\n 。 编辑: 据我所知,还没有知名的JS库可用于转义字符串中的所有特殊字符。 但是,您可以链接.replace()方法并替换所有特殊字符,如下所示: var myJSONString = JSON.stringify(myJSON); var myEscapedJSONString = myJSONString.replace(/\\n/g, "\\n") .replace(/\\'/g, "\\'") .replace(/\\"/g, '\\"') .replace(/\\&/g, "\\&") .replace(/\\r/g, "\\r") .replace(/\\t/g, "\\t") .replace(/\\b/g, "\\b") .replace(/\\f/g, "\\f"); // myEscapedJSONString is now ready to be POST'ed to the server. 但这很讨厌,不是吗? 输入函数的美感
  • servlet如何工作? 实例化,会话,共享变量和多线程(How do servlets work? Instantiation, sessions, shared variables and multithreading)
    问题 假设我有一个Web服务器,其中包含许多Servlet。 为了在这些servlet之间传递信息,我正在设置会话和实例变量。 现在,如果有2个或更多用户向该服务器发送请求,那么会话变量将如何处理? 它们对所有用户都是通用的还是对每个用户都是不同的? 如果它们不同,那么服务器如何区分不同的用户? 还有一个类似的问题,如果有n用户正在访问特定的servlet,那么仅在第一个用户第一次访问该servlet时才实例化该servlet,还是为所有用户分别实例化该servlet? 换句话说,实例变量将如何处理? 回答1 ServletContext 当servlet容器(如Apache Tomcat)启动时,它将部署并加载其所有Web应用程序。 加载Web应用程序时,Servlet容器会一次创建ServletContext并将其保存在服务器的内存中。 web应用程序的web.xml和所有包含的web-fragment.xml文件被解析,并且每个<servlet> <filter>和<listener>实测值(或带有加注解的每个类@WebServlet , @WebFilter和@WebListener分别)是实例化一次并保存在服务器的内存中。 对于每个实例化的过滤器,将使用新的FilterConfig调用其init()方法。 当Servlet的<servlet><load-on
  • 红宝石有真正的多线程吗?(Does ruby have real multithreading?)
    问题 我知道使用绿色线程的“红宝石”“合作”线程。 如何在应用程序中创建真正的“ OS级”线​​程,以便利用多个cpu内核进行处理? 回答1 约格(Jörg)在2011年9月发表评论时进行了更新 你似乎在这里混淆了两个完全不同的事情:Ruby编程语言和一个具体实施Ruby编程语言的特定线程模型。 当前,大约有11种不同的Ruby编程语言实现,它们具有非常不同且独特的线程模型。 (不幸的是,实际上这11种实现中只有两种可以用于生产,但是到今年年底,这个数字可能会增加到4到5种。)(更新:现在是5:MRI,JRuby,YARV(解释器) Ruby 1.9),Rubinius和IronRuby)。 第一个实现实际上没有名称,这使得引用它变得很尴尬,而且确实令人烦恼和混乱。 它最常被称为“ Ruby”,它比没有名字更令人讨厌和混乱,因为它导致Ruby编程语言的功能和特定的Ruby实现之间的无休止的混淆。 它有时也称为“ MRI”(对于“ Matz的Ruby实现”而言),CRuby或MatzRuby。 MRI在其解释器中将Ruby Threads实现为G​​reen Threads。 不幸的是,它不允许并行调度这些线程,它们一次只能运行一个线程。 但是,任意数量的C线程(POSIX线程等)都可以与Ruby线程并行运行,因此创建自己的线程的外部C库或MRI C扩展仍可以并行运行。
  • 属性类如何工作?(How do attribute classes work?)
    问题 我的搜索仅显示解释如何使用属性并将其应用于类的指南。 我想学习如何创建自己的属性类以及它们如何工作的机制。 如何实例化属性类? 当实例化应用于它们的类时,实例化它们吗? 是否为实例化的每个类实例化了一个实例? 例如,如果我将SerializableAttribute类应用于MyData类,并实例化5个MyData实例,那么在幕后会创建5个SerializbleAttribute类的实例吗? 还是所有人之间仅共享一个实例? 属性类实例如何访问与它们关联的类? SerializableAttribute类如何访问它所应用的类,以便可以序列化其数据? 它是否具有某种SerializableAttribute.ThisIsTheInstanceIAmAppliedTo属性? :)还是反方向工作,每当我序列化某些东西时,我传递MyClass实例的Serialize函数就会反射性地通过Attributes并找到SerialiableAttribute实例? 回答1 以前,我在日常工作中没有使用过属性,但是我已经阅读了有关它们的内容。 我也做了一些测试,以备份我在这里所说的内容。 如果我在任何地方都不对,请随时告诉我:) 据我所知,属性不充当常规类。 创建适用于它们的对象时,它们不会被实例化,不是一个静态实例,不是每个对象实例1个。 他们也不访问他们所应用的类。 相反
  • 各种编程语言中的Unicode支持(Unicode Support in Various Programming Languages)
    问题 我想在规范的地方汇集有关各种语言的Unicode支持的信息。 它是核心语言的一部分吗? 图书馆提供吗? 根本不可用吗? 是否有某种语言的Unicode信息资源流行资源? 请每个答案使用一种语言。 另外,如果您可以将语言作为标题,以使其更易于查找。 回答1 佩尔 Perl主要具有内置的Unicode支持。 有点。 从perldoc: perlunitut-在Perl中使用Unicode的教程。 绝大部分都以绝对的方式讲授关于Unicode应该做什么和不应该做什么的知识。 涵盖基础知识。 perlunifaq-有关Perl中Unicode的常见问题。 perluniintro-Perl中的Unicode简介。 比perlunitut的“伪善”要少。 perlunicode-当您绝对必须了解Unicode和Perl的所有知识时。 回答2 Python 3k Python 3k(或3.0或3000)具有处理文本(unicode)和数据的新方法: 文字与数据而不是UnicodeVs。 8位。 另请参见Unicode HOWTO。 回答3 爪哇 与.NET相同,Java在内部使用UTF-16:java.lang.String String表示采用UTF-16格式的字符串,其中补充字符由代理对表示(有关更多信息,请参见Character类中的Unicode字符表示部分)。
  • 您如何通过JSON.stringify ES6 Map?(How do you JSON.stringify an ES6 Map?)
    问题 我想开始使用ES6 Map而不是JS对象,但由于无法弄清楚如何对地图进行JSON.stringify()而被拒之门外。 我的键保证是字符串,并且我的值将始终列出。 我真的必须编写包装方法来序列化吗? 回答1 JSON.stringify和JSON.parse支持第二个参数。 replacer和reviver 。 通过以下的replacer和reviver,可以添加对本机Map对象的支持,包括深度嵌套的值 function replacer(key, value) { if(value instanceof Map) { return { dataType: 'Map', value: Array.from(value.entries()), // or with spread: value: [...value] }; } else { return value; } } function reviver(key, value) { if(typeof value === 'object' && value !== null) { if (value.dataType === 'Map') { return new Map(value.value); } } return value; } 用法: const originalValue = new Map([['a', 1]