点和运算符表示法Ruby之间的区别

时间:2017-03-10 01:07:04

标签: ruby

我想知道Ruby中点和运算符表示法之间的区别。以下是一些例子

public class dBConnect
{
    //create SQLconnection variable
    private SqlConnection con;
    //create default constructor that passing a string to con
    public dBConnect()
    {
        try
        {
            con = new SqlConnection(@"Server=Trump\SQLEXPRESS;
        Database=Demo;User Id=sa;Password = stevejobs;");
        }
        catch(Exception exCon)
        {
            Console.WriteLine("Unable to connect to database: {0}", exCon);
        }
    }
    //create Select method to Pour the data into the DataTable
    public DataTable SelectAll(string procName, SqlParameter[] para = null)
    {
        //create a DataTable to store Data from DB
        DataTable dt = new DataTable();
        //create SQLCommand
        SqlCommand cmd = new SqlCommand(procName, con);
        //declare that cmdType is sp
        cmd.CommandType = CommandType.StoredProcedure;
        //input parameter of cmd
        if (para != null)
            cmd.Parameters.AddRange(para);
        //create dataAdapter object

        //InvalidOperationException was thrown at here
        SqlDataAdapter da = new SqlDataAdapter(cmd);

        //declare that cmd is select command of da 
        da.SelectCommand = cmd;
        //use try/catch/finally to establish a connection
        try
        {
            con.Open();
            da.Fill(dt);
        }
        catch(Exception sqlEx)
        {
            Console.WriteLine(@":Unable to establish a connection: {0}", sqlEx);
        }
        finally
        {
            con.Close();
            con.Dispose();
        }
        return dt;
    }
}

由于两者都调用一个方法并返回类似的对象,我怀疑点符号或运算符方法更有效。任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:4)

  

[...]如果我们使用该点.表示法调用对象上的方法,那么2 + 3 * 4中的点在哪里?

     

诀窍是:Ruby默默地为你添加它们。如果您编写以下代码:

number = 2 + 3 * 4
     

然后Ruby会将此转换为以下内容:

number = 2.+(3.*(4))
     

- Operators are methods | Ruby for Beginners

至于性能差异:

# bmbm_dot_vs_operators.rb
require "benchmark"

Benchmark.bmbm do |x|
  x.report("dots") { 2.+(3.*(4)) }
  x.report("operators") { 2 + 3 * 4 }

  x.report("operators") { 4 + 2 * 3 }
  x.report("dots") { 4.+(2.*(3)) }
end

在我的系统上运行时(MacBook Pro(Retina,15英寸,2013年末)),它会产生以下结果

$ ruby bmbm_dot_vs_operators.rb
Rehearsal ---------------------------------------------
dots        0.000000   0.000000   0.000000 (  0.000005)
operators   0.000000   0.000000   0.000000 (  0.000002)
operators   0.000000   0.000000   0.000000 (  0.000002)
dots        0.000000   0.000000   0.000000 (  0.000002)
------------------------------------ total: 0.000000sec

                user     system      total        real
dots        0.000000   0.000000   0.000000 (  0.000002)
operators   0.000000   0.000000   0.000000 (  0.000002)
operators   0.000000   0.000000   0.000000 (  0.000002)
dots        0.000000   0.000000   0.000000 (  0.000002)

结果尚无定论。

当使用内联运算符而不是点等式方法时,性能几乎没有可测量的差异。

此外,第一个操作始终是最慢的,因此为了比较基准测试顺序,它被多次包括在内。

<强>参考文献:

答案 1 :(得分:0)

tl; dr:运算符表示法是用于点表示法的语法糖。我不希望任何明显的性能差异。

如果你看Ruby's grammar,你会发现以下内容:

call_bin_op(recv,id,arg1) call_bin_op_gen(parser, (recv),(id),(arg1))

这基本上说你的例子中的+这样的二元运算符有一个接收者,一个ID(把它想象为符号的CRuby)和一个参数,就像一个带有一个参数的方法调用一样。

如果您再看call_bin_op_gen,就会发现它实际上转化为通话:

static NODE *
call_bin_op_gen(struct parser_params *parser, NODE *recv, ID id, NODE *arg1)
{
    value_expr(recv);
    value_expr(arg1);
    return NEW_CALL(recv, id, NEW_LIST(arg1));
}