Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby如何将方法转换为符号作为参数?_Ruby - Fatal编程技术网

Ruby如何将方法转换为符号作为参数?

Ruby如何将方法转换为符号作为参数?,ruby,Ruby,respond\u to?方法将要检查的方法作为参数,但作为符号 为什么作为象征?ruby是如何将方法转换成符号的?没有魔法。方法通过其名称(即符号)附加到对象。事实上,Math.sin(2)基本上是Math.send(:sin,2)(“发送消息:sin到Math对象,带参数2)的缩写。您还可以访问方法本身:Math.method(:sin)将为您提供关联的method对象(其名称Math.method(:sin).name,当然是:sin),而Math.methods将列出所有实现的方法的名称

respond\u to?
方法将要检查的方法作为参数,但作为符号


为什么作为象征?ruby是如何将方法转换成符号的?

没有魔法。方法通过其名称(即符号)附加到对象。事实上,
Math.sin(2)
基本上是
Math.send(:sin,2)
(“发送消息
:sin
Math
对象,带参数
2
)的缩写。您还可以访问方法本身:
Math.method(:sin)
将为您提供关联的
method
对象(其名称
Math.method(:sin).name
,当然是
:sin
),而
Math.methods
将列出所有实现的方法的名称
Math.respond_to?(:sin)
基本上可以重写为
Math.methods.include(:sin)
(这是简化的,因为它忽略了
respond_to_missing?
,但是……对于本次讨论来说已经足够接近了)

这样想吧。你去朋友家,他们的妈妈开门。你会问,“你好,蒂姆在吗?”你不需要把你的朋友拖到门口,然后问“你好,这个人在吗?”这个名字同样适用

编辑:

嗯,我现在很困惑。“命名”的确切含义是什么?我的意思是也许举个小例子。我用array.each来称呼它。“名字”什么时候开始起作用

我不知道如何更好地解释它。方法有名字,就像人有名字一样。当您说
array.each
时,它正在向变量
array
中包含的对象发送消息
:each
,这与
array.send(:each)
的作用非常相似。方法是通过名称附加到对象的代码片段:当对象接收到消息时,它运行与该消息关联的代码片段

具体地说,在标准Ruby实现中,类
数组
的对象在接收消息
:each
时,将调用Ruby源代码中定义的C函数
rb_ary_each
,并使用
rb_define_方法链接到消息
:each
(rb_cArray,“each”,rb_ary_each,0)
(也在Ruby源代码中)

在Ruby内部,基本上有两种等价的方法来定义方法。这两个是等效的:

class Foo
  def bar
    puts "hello"
  end
end

class Foo
  define_method(:bar) do
    puts "hello"
  end
end

它们都做了相同的事情:将消息
:bar
与代码段相关联
do puts“hello”end
。当
:bar
Foo
接收时(无论是通过
Foo.send(:bar)
还是通过
Foo.bar
),这段代码都会运行。

不必将
方法\u name
作为符号传递,也可以将其作为字符串传递
。回复?('method\u name')
。好的,谢谢。因为在codecadamy上,他们说它以符号作为参数。所以一个字符串也算数。但是为什么它也需要一个符号呢?这个方法对符号或字符串(参数)做了什么?“他们在CodeAdamy上说”——他们可以说任何他们想说的话。要找到真相,请阅读.Ok thx以获得该解释。这也意味着,例如,枚举类中的每个都是一个符号:每个?我说得对吗?这在这里起作用了吗(特别是对于
符号
字符串
接受?或者它们是两个不同的概念?不-方法
来自
可枚举
模块的每个
都被命名为
:每个
。就像Tim(个体)不是Tim(名称)一样“@Md.FarhanMemon”您链接到Ruby on Rails的文档。Rails是Ruby上的一个框架。该方法是类中定义的核心Ruby方法,可以与Rails一起使用,也可以不与Rails一起使用。@Md.FarhanMemon从某种意义上说,您是正确的。大多数方法处理函数都会接受名称作为字符串和符号。
Math.method(“sin”)
返回与数学方法(:sin)相同的结果
确实如此。就Ruby而言,符号和字符串是不同的东西,但这些函数处理这两个方面的问题,就像HWIA一样。但是说HWIA在这里起作用是因为这种类似的行为,就像说汽车在银行保险箱中起作用,因为它们都使用钥匙一样。:)