在哪里可以找到原生Ruby源代码,比如instance_exec?

在哪里可以找到原生Ruby源代码,比如instance_exec?,ruby,implementation,definition,Ruby,Implementation,Definition,我知道有一个函数“method(:instance\u exec).source\u location”可以查找源代码,但只适用于gems中的代码。但在这种特殊情况下它返回null,因为该方法来自原生ruby。我在谷歌上搜索,但我找不到这是写在哪里的。 在我的特殊情况下,我想更好地了解instance_exec如何更改proc范围的值 说正经话,我想在大学里做这件事 precondition { divisor != 0 } postcondition { |result| result *

我知道有一个函数“method(:instance\u exec).source\u location”可以查找源代码,但只适用于gems中的代码。但在这种特殊情况下它返回null,因为该方法来自原生ruby。我在谷歌上搜索,但我找不到这是写在哪里的。 在我的特殊情况下,我想更好地了解instance_exec如何更改proc范围的值

说正经话,我想在大学里做这件事

precondition { divisor != 0 } 
postcondition { |result| result * divisor == dividend}
  def divide(dividend, divisor)
    dividend / divisor
  end
我知道instance_exec在proc范围内更改“self”值。我想在运行proc时将'divisor'添加到
{divisor!=0}
proc的范围中,我认为阅读instance_exec的实现将非常有帮助。 因为这是为了上大学,我不能用任何宝石来做这件事,只有标准的ruby

PS右键单击+转到+实现仅显示我

  def instance_exec(*args)
    # This is a stub implementation, used for type inference (actual method behavior may differ)
    yield
  end
我知道有一个函数“method(:instance\u exec).source\u location”可以查找源代码,但只适用于gems中的代码

那不是真的<代码>方法#源位置适用于gems中没有的方法:

模块Foo
def棒;结束
结束
p Foo.instance\u方法(:bar).source\u位置
#=>['test.rb',2]
这里没有宝石。事实上,如果我根本不使用任何文件,它甚至可以工作,只要在命令行上使用
ruby-e
;在这种情况下,结果将是
['-e',2]

另一方面,如果没有Ruby源代码,那么即使对于gems,它也会返回
nil

Method#source_location
的返回值与该方法是否来自gem无关,唯一重要的是是否有一个Ruby源需要定位

但在这种特殊情况下它返回null,因为该方法来自原生ruby

它不应该返回
null
,它应该返回一个两元素数组或
nil
,但决不能返回
null
。如果真是这样的话,你的Ruby安装似乎有严重的问题

我在谷歌上搜索,但我找不到这是写在哪里的

它将出现在您正在使用的Ruby实现的源代码中。您尚未指定要使用的实现,因此我无法确切地告诉您,但以下是一些示例:

在中,它在以下方面实施:

def实例执行(*args,&prc)
raise::LocalJumpError,“缺少块”,除非给出块?
env=prc.block
返回prc.ruby_方法。如果prc.ruby_方法,则调用(*args)
词法范围=env.lexical范围
if::ImmediateValue===self
词法作用域=词法作用域。使用禁用的作用域
其他的
sc=::Rubinius::Type.object\u singleton\u类(self)
词法范围=词法范围。使用当前范围作为(sc)
结束
在(self、词法范围、true、*args)下返回环境调用
结束
在中,它在以下方面实施:

@CoreMethod(name=“instance\u exec”,needsBlock=true,rest=true)
公共抽象静态类InstanceExecNode扩展了CoreMethodArrayArgumentsNode{
公共静态InstanceExecNode创建(){
返回InstanceExecNodeFactory.create(null);
}
@子私有CallBlockNode CallBlockNode=CallBlockNode.create();
抽象对象executeInstanceExec(对象自身,对象[]参数,RubyProc块);
@专业化
受保护对象instanceExec(对象接收器、对象[]参数、RubyProc块){
final DeclarationContext DeclarationContext=新DeclarationContext(
能见度.公众,
新的SingletonClassofSelfDefaultDefineee(接收方),
block.declarationContext.getRefinements());
返回callBlockNode
.executeCallBlock(declarationContext、block、receiver、block.block、参数);
}
@专业化
受保护对象instanceExec(对象接收器、对象[]参数、未提供的块){
抛出新的RaiseException(getContext(),coreExceptions().localJumpError(“未给出块”,this));
}
}
我知道有一个函数“method(:instance\u exec).source\u location”可以查找源代码,但只适用于gems中的代码

那不是真的<代码>方法#源位置适用于gems中没有的方法:

模块Foo
def棒;结束
结束
p Foo.instance\u方法(:bar).source\u位置
#=>['test.rb',2]
这里没有宝石。事实上,如果我根本不使用任何文件,它甚至可以工作,只要在命令行上使用
ruby-e
;在这种情况下,结果将是
['-e',2]

另一方面,如果没有Ruby源代码,那么即使对于gems,它也会返回
nil

Method#source_location
的返回值与该方法是否来自gem无关,唯一重要的是是否有一个Ruby源需要定位

但在这种特殊情况下它返回null,因为该方法来自原生ruby

它不应该返回
null
,它应该返回一个两元素数组或
nil
,但决不能返回
null
。如果真是这样的话,你的Ruby安装似乎有严重的问题

我在谷歌上搜索,但我找不到这是写在哪里的

它将出现在您正在使用的Ruby实现的源代码中。您尚未指定要使用的实现,因此我无法确切地告诉您,但以下是一些示例:

在中,它在以下方面实施:

def实例执行(*args,&prc)
raise::LocalJumpError,“缺少块”,除非给出块?
env=prc.block
返回prc.ruby_方法。如果prc.ruby_方法,则调用(*args)
词法范围=env.lexical范围
if::ImmediateValue===self
词法作用域=词法作用域。使用禁用的作用域
其他的
sc=::Rubinius::Type.object\u singleton\u类(self)
词法范围=词法范围。使用当前范围作为(sc)
结束
返回en