这个ruby代码段是做什么的?

这个ruby代码段是做什么的?,ruby,Ruby,作为一名ruby新手,我试图理解基线中的一段代码。有人能帮我吗?代码片段如下所示 %w{word1 word2}.each { |att| define_method(att.to_sym) { return nil }} 在运行此行的上下文中,将定义两个方法 def word1 return nil end def word2 return nil end 比如说 class MyClass %w{word1 word2}.each { |att| define_method

作为一名ruby新手,我试图理解基线中的一段代码。有人能帮我吗?代码片段如下所示

%w{word1 word2}.each { |att| define_method(att.to_sym) { return nil }}

在运行此行的上下文中,将定义两个方法

def word1
  return nil
end

def word2
  return nil
end
比如说

class MyClass
  %w{word1 word2}.each { |att| define_method(att.to_sym) { return nil }}
end
加载my_class.rb文件后,您将能够使用生成的方法

test = MyClass.new
test.word1
# or
test.word2

%w{word1 word2}
=创建一个如下所示的数组
['word1','word2']

.each
=迭代数组中的每个值
{}
=这是一个代码块数组中的每个值都将通过该块运行
|attr |
=块参数。数组中的每个值都将放在此处
define\u method
=从参数定义方法
(att.to_sym)
=新方法的名称。这将是
word1
,然后是
word2

{return nil}
=新方法的主体

因此,您正在定义两种新方法。一种方法称为
word1
,另一种方法称为
word2
。每种方法都有一个
返回nil
的主体。它们将如下所示:

def word1
  return nil
end

def word2
  return nil
end
比如,对于教程,你最好在其他网站上阅读。以下是理解所提供代码所需的所有参考资料:

  • ,用于
    %w{word1 word2}

    百分比字符串 除了创建的
    %(…)
    之外,
    %
    还可以 创建其他类型的对象。与字符串一样,大写字母 字母允许插入和转义字符,而 小写字母禁用它们

    以下是ruby中百分比字符串的类型:

    • %i
      符号
    • %q
    • %r
      正则表达式
    • %s
    • %w
      字符串
    • %x
      反勾选(捕获子shell结果)
    对于百分比字符串的两种数组形式,如果希望 在其中一个必须转义的数组项中包含空格 它包含一个“\”字符:

    %w[one one-hundred\ one]
    #=> ["one", "one-hundred one"]
    
    如果您分别使用“(”、“[”、“{”、”,则可以使用大多数其他 百分比字符串分隔符的非字母数字字符 例如“%”、“|”、“^”等

  • 每个{|项|块}→ 阿利 每个→ 统计员 为
    self
    中的每个元素调用给定的块一次, 将该元素作为参数传递。返回数组 本身

    如果未给出任何块,则返回一个

    a = [ "a", "b", "c" ]
    a.each {|x| print x, " -- " }
    
    产生:

    a -- b -- c --
    
  • 定义方法(符号、方法)→ 符号 定义方法(符号){block}→ 符号 在接收器中定义一个实例方法 参数可以是
    过程
    方法
    取消绑定方法
    对象。如果指定了块,则将其用作方法 body。使用
    instance\u eval
    计算此块

    class A
      def fred
        puts "In Fred"
      end
      def create_method(name, &block)
        self.class.define_method(name, &block)
      end
      define_method(:wilma) { puts "Charge it!" }
    end
    class B < A
      define_method(:barney, instance_method(:fred))
    end
    a = B.new
    a.barney
    a.wilma
    a.create_method(:betty) { p self }
    a.betty
    
    这也可用于创建无法编辑的符号 使用
    :xxx
    符号表示

    'cat and dog'.to_sym   #=> :"cat and dog"
    

所以这不是一个很好的教程网站。这可以用很多Ruby资源中的任何一个来回答。从
%w
开始,这是一个“单词数组”。如果你能让你的irb工作,你也可以使用在线Ruby repl()。Codestyle建议使用
%w[word1 word2]
而不是
%w(word1 word2)
%w{word1 word2}
这几乎使用了整个Ruby语言中的所有功能,您必须进一步缩小您的问题范围,否则答案基本上就是整个Ruby语言规范。虽然它似乎没有文档记录,但似乎
。在这里没有必要使用to_sym
定义方法(“dog”){“woof”};dog=>“woof”
。这并不奇怪,因为许多Ruby方法接受的参数是方法的名称,它们接受符号或字符串。请注意,块中不需要
返回
"Koala".intern         #=> :Koala
s = 'cat'.to_sym       #=> :cat
s == :cat              #=> true
s = '@cat'.to_sym      #=> :@cat
s == :@cat             #=> true
'cat and dog'.to_sym   #=> :"cat and dog"