【问题标题】:Do these examples in Bash demonstrate dynamic typing and static typing?Bash 中的这些示例是否演示了动态类型和静态类型?
【发布时间】:2016-04-23 23:57:50
【问题描述】:

在 Bash 中,以下示例演示了编程语言中的哪些概念?

  1. 在第一个例子中,变量bar首先是一个字符串类型 值hello,然后在算术表达式中使用时, 它的值变为0。所以在我看来bar 的类型 从字符串更改为整数。

    这个例子是否演示了 隐式类型转换动态类型的概念 (因为bar 的类型没有明确声明或定义, 并根据上下文从字符串更改为整数)?

    $ bar=hello
    $ echo $bar
    hello
    $ echo $(( bar ))
    0
    
  2. 在第二个例子中,变量bbb被声明为整数 类型,我给它一个值3*8,即24。然后我给它 hello,其值变为0

    hello 是一个字符串吗 值还是其他变量?如果hello是一个字符串值,那么在赋值给变量bbb之前,必须有从字符串值hello到整数值0的类型转换。

    这个例子是否展示了这个概念 静态类型,因为bbb 的类型是明确的 从头声明并且不能更改?

    $ declare -i bbb
    $ bbb=3*8
    $ echo bbb
    24
    $ bbb=hello
    $ echo $bbb
    0
    

【问题讨论】:

    标签: bash types programming-languages dynamic-typing static-typing


    【解决方案1】:

    关于#1,这不是类型转换;这是一个参数扩展。

    1. x=6; echo $((x)) 产生 6。该值是有效的整数文字。
    2. x=foo; foo=6; echo $((x)) 也产生 6。x 的值是一个字符串,它用整数值命名参数。
    3. unset x; echo $((x)) 产生 0,因为 x 未设置。
    4. x=3+5; y=bar; z=; echo $((x + y + z)) 产生 0,因为三个字符串中的任何一个都不能通过前面三个规则中的任何一个扩展为非零整数值。

    关于#2,bbb 具有其整数属性集这一事实意味着分配给它的任何值都被隐式地视为算术表达式。也就是说,bbb=whatever 等价于bbb=$((whatever))。因此,hello 受到与上述相同的扩展。具体来说,

    $ declare -i bbb
    $ bbb=hello
    $ echo $bbb
    0
    $ hello=6
    $ bbb=hello
    $ echo $bbb
    6
    

    【讨论】:

    • 谢谢。 4.x=3+5; y=bar; z=; echo $((x + y + z)) 产生8。为什么说0? 2.x=foo; foo=6; echo $((x)),为什么最后一条命令可以从变量x追踪到它的值foo,然后从变量foo追踪到它的值6,而不是停在@987654341的值foo @?
    • 我从示例中删除了x=3+5;我以为我在测试中看到它扩展到 0,但我在某个地方犯了一个错误。关于x/foo例子,展开是递归的;每次扩展在算术上下文中产生一个字符串时,那个字符串也被扩展,并且该过程重复直到可以导出一个整数值。
    猜你喜欢
    • 2015-10-26
    • 2011-01-20
    • 2012-07-11
    • 2012-03-03
    • 2010-12-02
    • 2015-04-17
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多