Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >嵌入式ruby脚本中的方法调用和变量调用之间的语法差异?

嵌入式ruby脚本中的方法调用和变量调用之间的语法差异?
EN

Stack Overflow用户
提问于 2017-04-25 11:51:50
回答 2查看 132关注 0票数 0

这可能是一个新手问题,但它是这样的:

我正在尝试解析嵌入的ruby代码,我需要一些帮助来理解用于方法调用和嵌入式ruby脚本中的变量访问的synthax。

例如,在这个调用中,@user.followed_users.count (据我所知) @user是一个用户模型的实例,followed_users是一个(自动生成的)方法,count也是一个方法,对吗?

但是这些叫做micropost.content micropost.created_at micropost.user的东西是什么呢?它们来自这个erb文件:

代码语言:javascript
运行
AI代码解释
复制
<li>
  <span class="content"><%= micropost.content %></span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(micropost.created_at) %> ago.
  </span>
  <% if current_user?(micropost.user) %>
    <%= link_to "delete", micropost, method: :delete,
                                     data:{ confirm: "You sure?" },
                                     title: micropost.content %>
  <% end %>
</li> 

(这些是michael hartl rails教程中的代码示例)

Rails中有什么样的语法用于方法调用和从erb文件访问变量?是否可以从非实例或类变量的ruby文件中访问变量?

提前感谢您的阅读和帮助:)

EN

回答 2

Stack Overflow用户

发布于 2017-04-25 13:53:18

语法是相同的。

除了ERB是一种嵌入式语言,只有" ERB“标记中的代码被<% %>执行之外,erb和Ruby在语法上没有什么主要区别。

局部变量和方法有什么区别?

方法是在对象上定义的方法对象。

代码语言:javascript
运行
AI代码解释
复制
def foo
  "hello world"
end

# we can call it by
self.foo

# we can access the method object by
self.method(:foo)

这定义了main上的foo方法。

代码语言:javascript
运行
AI代码解释
复制
bar = "value"

定义局部作用域变量bar。并不是说你不能做self.bar,因为它只指向一个内存寄存器,而不是一个方法!你不需要调用变量,而是引用它们*。因此,术语“变量调用”是错误的。

正如@SergioTulentsev指出的那样,您可以使用defined?检查micropost是局部变量还是方法。请注意下面使用rails本地变量时的注意事项。

请参见:

在rails之外使用ERB

在Ruby语言中,顶层对象称为main,它是“全局”对象。当您为实例变量<% @foo = "bar" %>赋值时,您将其赋值给main,即隐式self。

代码语言:javascript
运行
AI代码解释
复制
<%# raw_template.erb %>
<%= self.inspect %>

如果我们运行erb raw_template.erb,它将输出main

赋值一个常规的词法变量(一个局部的) <% foo = "bar" %>就像在任何其他ruby代码中一样。

正如您所看到的,在ERB模板和任何其他Ruby代码中变量的工作方式没有区别。

rails有什么不同之处?

Rails的一个核心部分是所谓的视图上下文。这是ActionView::Base的一个实例,它是隐式的自我--“全局”对象。

你不必相信我的话。尝试在Rails的视图中包含以下内容:

代码语言:javascript
运行
AI代码解释
复制
<pre>
  <%= self.inspect %>
</pre>

Rails获取控制器的所有实例变量,并将它们分配给视图上下文。这就是为什么您在控制器中分配的@something实例变量也可用于您的视图。

Rails locals不是真正的局部变量

视图上下文还包含一个名为local_assigns的散列。这些是在呈现模板时可以传递的“局部变量”:

代码语言:javascript
运行
AI代码解释
复制
render template: 'test', locals: { foo: 'bar' }

当您在test.html.erb模板中调用<%= foo %>时,调用将转到method_missing,它将检查local_assigns是否具有:foo密钥。

这就是为什么在local_assigns变量上使用defined?不能像预期的那样工作。

但是语法是一样的。

Rails使用了一些元编程魔术来传递变量-但它不会改变语言的语法。

是否可以访问非实例或类变量的ruby文件中的变量?

是的,全局变量--在Ruby语言中,你可以使用符号$来创建一个全局变量。

代码语言:javascript
运行
AI代码解释
复制
$foo = "bar"

但这很少使用,因为globals are evil。在Ruby中有更好的方法。

票数 1
EN

Stack Overflow用户

发布于 2017-04-25 11:58:36

<%= micropost.content %>中的micropost可以是局部变量,也可以是方法。没有办法区分哪一个是它,仅仅通过看这条线。最重要的是,micropost的计算结果是可以调用.content的。

如果你想知道它是哪一个(用于教育),你可以像这样输出它的类型:

代码语言:javascript
运行
AI代码解释
复制
<%= defined?(micropost) %>

它将返回"local-variable“或"method”(如果未定义,则返回nil )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43609921

复制
相关文章
【Groovy】Groovy 脚本调用 ( Linux 中调用 Groovy 脚本 | Windows 中调用 Groovy 脚本 )
在 命令行 , Groovy 脚本 , Groovy 类 , Java 类中 , 可以调用 Groovy 脚本 ;
韩曙亮
2023/03/30
2K0
C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用)
本文转载:http://www.csframework.com/archive/2/arc-2-20110805-1771.htm
跟着阿笨一起玩NET
2018/09/18
8.5K0
C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用)
Python函数定义的语法形式和调用方法
以上两种方法,第一种代码重复率太高,代码美观效果太差,虽然能实现效果,但是因为数量比较少,还能手工打出来这几行代码,如果是打印1-100000就很难实现了。这时候for循环还是可以实现的,但是for循环只能实现类似的数字和变量循环,无法进行复杂的功能开发。鉴于此,函数这个概念就被python引入了,下面先来看看函数是怎么实现上面的效果的,还是两种方法。
python自学网
2021/12/05
6900
Python函数定义的语法形式和调用方法
java调用ruby代码
问题: 最近在做一个应用的时候碰到了一个问题。客户端需要调用服务器端传回的脚本信息,然后执行。其中脚本类型包括ruby。而java中调用ruby的代码大致如下: 1 String jrubyCode="puts 'hello world'"; 2 ScriptEngineManager manager = new ScriptEngineManager(); 3 ScriptEngine engine = manager.getEngineByName("jruby"); 4 engine.eval(jru
SecondWorld
2018/03/14
2.3K0
java调用ruby代码
【Groovy】Groovy 脚本调用 ( Java 类中调用 Groovy 脚本 )
Java 类中调用 Groovy 脚本 , 与 Groovy 类中调用 Groovy 脚本 , 代码基本类似 ;
韩曙亮
2023/03/30
1.9K0
【Groovy】Groovy 脚本调用 ( Java 类中调用 Groovy 脚本 )
【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 调用 evaluate 方法执行 Groovy 脚本 | 参数传递 )
在 【Groovy】Groovy 脚本调用 ( Groovy 脚本编译 | Groovy 脚本字节码文件分析 ) 博客中 , 已经分析了 Groovy 脚本的本质 , Groovy 脚本继承了 groovy.lang.Script 类 ;
韩曙亮
2023/03/30
2K0
【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 调用 evaluate 方法执行 Groovy 脚本 | 参数传递 )
方法的定义和调用
为每个运算符单独的创建一个新的类和main方法,我们会发现这样编写代码非常的繁琐,而且重复的代码过多。能否避免这些重复的代码呢,就需要使用方法来实现。 方法:就是将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。 当我们需要这个功能的时候,就可以去调用。这样即实现了代码的复用性,也解决了代码冗余的现象。
共饮一杯无
2022/11/28
8610
【说站】java调用shell脚本的方法
1、通过ProcessBuilder进行调度,这种方法比较直观,而且参数的设置也比较方便。
很酷的站长
2022/11/23
1.4K0
【说站】java调用shell脚本的方法
PageAdmin 栏目树html脚本调用语法
siteId参数可以不设置,不设置则默认当前站点id,下面的方法也类似,不再一一说明 2、获取当前站点一级栏目的html脚本
用户5258701
2019/06/09
1.2K0
【Groovy】闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )
在 Groovy 脚本中 , 在 Closure 闭包中 , 可以直接调用 Groovy 脚本中定义的方法 ;
韩曙亮
2023/03/30
3.1K0
python调用bat脚本并向bat脚本传递list变量
我用的是subprocess.call的方法,但是无法传递变量,求大神指点,希望可以实现python调用bat脚本并向bat脚本传递list变量
用户7542547
2020/07/09
3.1K0
SAP ABAP 程序之间的调用
一,同步调用从一个程序同步调用其他的ABAP程序,有2种方式: 1,调用程序被打断,当被调用程序执行完毕之后,调用程序继续执行。如:CALL FUNCTION <function>SUBMIT <program> AND RETURNCALL TRANSACTION <tcode> 使用CALL FUNCTION 'AAA'调用FM的时候,相应的FUNCTION GROUP被加载到调用程序所在的internal session。当FM执行完毕,接着执行调用程序。FUNCTION GROUP和其GLOBAL DATA会一直保存在这个internal session直到调用程序结束。当调用程序再次调用这个FM的时候,不会再次加载相应的FUNCTION GROUP。这个FUNCTON GROUP的GLOBAL DATA和第一次调用它时的内容是一样的。 使用SUBMIT <program> AND RETURN或者CALL TRANSACTION <tcode>的时候,实际是插入了一个新的internal session,当被调用的程序执行完毕之后,新插入的internal session会被删除,继续执行调用程序。可以使用leave program语句来结束程序。
matinal
2020/11/27
1.1K0
solidity 智能合约之间的调用
在区块链上,有些功能往往无法通过一个智能合约完成,此时便会用到智能合约之间的调用。本篇文章带大家通过具体示例来了解一下智能合约之间的调用。
程序新视界
2019/08/14
2.7K0
python通过字符串调用方法_python调用shell脚本
代码中借鉴了https://blog.csdn.net/weixin_43936250/article/details/105543266的sm3加密,和https://blog.csdn.net/jerry_liufeng/article/details/109603462的目录实时监控
全栈程序员站长
2022/10/01
4980
在AppCode中的razor调用HtmlHelper方法和UrlHelper方法
using System.Web.WebPages; using System.Web.Mvc;
javascript.shop
2019/09/04
2.1K0
SAP ABAP 程序之间的调用
一,同步调用从一个程序同步调用其他的ABAP程序,有2种方式: 1,调用程序被打断,当被调用程序执行完毕之后,调用程序继续执行。如:CALL FUNCTION <function>SUBMIT <program> AND RETURNCALL TRANSACTION <tcode> 使用CALL FUNCTION 'AAA'调用FM的时候,相应的FUNCTION GROUP被加载到调用程序所在的internal session。当FM执行完毕,接着执行调用程序。FUNCTION GROUP和其GLOBAL DATA会一直保存在这个internal session直到调用程序结束。当调用程序再次调用这个FM的时候,不会再次加载相应的FUNCTION GROUP。这个FUNCTON GROUP的GLOBAL DATA和第一次调用它时的内容是一样的。 使用SUBMIT <program> AND RETURN或者CALL TRANSACTION <tcode>的时候,实际是插入了一个新的internal session,当被调用的程序执行完毕之后,新插入的internal session会被删除,继续执行调用程序。可以使用leave program语句来结束程序。
matinal
2020/11/05
1.1K0
SAP ABAP 程序之间的调用
spark程序中调用shell脚本
scala直接调用shell脚本是不行的,但是可以利用java调用shell脚本然后在spark代码中引入java代码实现。 参考:java代码调用shell脚本 shell脚本必须在spark的driver端调用,在worker端只能处理数据。因此必须在spark的DAG引擎开始或者结束以及两个job之间调用shell脚本。 根据以上前提,spark执行shell脚本代码只能在以下几个位置: SparkContext创建之前和创建之后但是创建RDD之前。 每一个job的Spark的action函数
神秘的寇先森
2019/03/11
2.5K0
spark程序中调用shell脚本
Rust 中 #[thread_local] 的drop方法不被调用
原文链接: https://drmingdrmer.github.io/tips/#/page/rust-thread-local-drop
drdrxp
2023/02/20
1.2K0
Rust 中 #[thread_local] 的drop方法不被调用
java调用python脚本返回的参数_javaweb调用python
实际工程项目中可能会用到 Java 和 python 两种语言结合进行,这样就会涉及到一个问题,就是怎么用 Java 程序来调用已经写好的 python 脚本呢,一共有四种方法可以实现:
全栈程序员站长
2022/11/01
4.6K1
点击加载更多

相似问题

变量方法调用-正确的Ruby语法?

10

ruby和python之间的语法差异?

21

Ruby -变量和@变量之间的差异

12

调用列表上的方法时不同语法之间的差异

21

用于调用方法的Ruby语法

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档