红宝石代码段做什么?

时间:2019-03-01 20:42:28

标签: ruby

作为一名红宝石新手,我试图了解我们基线中的一小段代码。有人可以帮我吗?该代码段显示在下面

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

jdv said in the comments一样,对于教程来说,在其他网站上可能会更好。这里是理解所提供代码段所需的所有参考:

  • Percent strings,用于%w{word1 word2}

      

    字符串百分比

         

    除了创建String%(...)之外,%可能   创建其他类型的对象。与字符串一样,大写   字母允许插值和转义字符,而   小写字母禁用它们。

         

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

         
        
    • %i Array符号
    •   
    • %q String
    •   
    • %r正则表达式
    •   
    • %s Symbol
    •   
    • %w Array个字符串
    •   
    • %x反引号(捕获子外壳结果)
    •   
         

    对于百分比字符串的两种数组形式,如果您希望   在您必须转义的数组条目之一中包含空格   它带有“ \”字符:

    %w[one one-hundred\ one]
    #=> ["one", "one-hundred one"]
    
         

    如果使用“(”,“ [”,“ {”,“ <”,则必须使用   分别为“)”,“]”,“}”,“>”。您可以使用其他大多数东西   字符串分隔符百分比的非字母数字字符   例如“%”,“ |”,“ ^”等。

  • Array#each

      

    每个{|项目|阻止}→ary

         

    每个→枚举器

         

    self中的每个元素调用给定的块一次,   将该元素作为参数传递。返回数组   本身。

         

    如果没有给出块,则返回Enumerator

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

    产生:

    a -- b -- c --
    
  • Module#define_method

      

    define_method(符号,方法)→符号

         

    define_method(symbol){块}→符号

         

    在接收器中定义实例方法。 方法   参数可以是ProcMethodUnboundMethod   宾语。如果指定了块,则将其用作方法   身体。此区块使用instance_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
    
         

    产生:

    In Fred
    Charge it!
    #<B:0x401b39e8>
    
  • String#to_sym

      

    to_sym→符号

         

    返回与 str 对应的Symbol,创建   符号(如果以前不存在)。参见Symbol#id2name

    "Koala".intern         #=> :Koala
    s = 'cat'.to_sym       #=> :cat
    s == :cat              #=> true
    s = '@cat'.to_sym      #=> :@cat
    s == :@cat             #=> true
    
         

    这也可以用来创建不能   用:xxx表示。

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

答案 2 :(得分:1)

%w{word1 word2} =创建一个看起来像['word1', 'word2']的数组
.each =遍历数组中的每个值
{} =这是一个代码块,数组中的每个值都将通过该块运行
|attr| =块参数。数组中的每个值都将放在这里
define_method =通过参数定义方法
(att.to_sym) =新方法的名称。这将是word1,然后是word2
{ return nil } =新方法的主体

因此,正在发生的事情是您正在定义两个新方法。一种方法称为word1,另一种方法称为word2。这些方法中的每一个将具有return nil的主体。它们将如下所示:

def word1
  return nil
end

def word2
  return nil
end