SORU
4 Mart 2012, Pazar


Nerede ve nasıl (alt çizgi) _ değişkeni belirlenir?

En _’s special meaning in IRB as a holder for last return value ancak bunun da farkındayızdeğilburada sormak istediğim.

Bunun yerine, düz-eski-Ruby-kodu bir değişken adı olarak kullanıldıĞında _ soruyorum. Burada özel bir davranış, bir benzer görünüyor “değişken don't care” (Prolog à la). İşte bazı yararlı örnekler özgü bir davranış gösteren:

lambda { |x, x| 42 }            # SyntaxError: duplicated argument name
lambda { |_, _| 42 }.call(4, 2) # => 42
lambda { |_, _| 42 }.call(_, _) # NameError: undefined local variable or method `_'
lambda { |_| _   1 }.call(42)   # => 43
lambda { |_, _| _ }.call(4, 2)  # 1.8.7: => 2
                                # 1.9.3: => 4
_ = 42
_ * 100         # => 4200
_, _ = 4, 2; _  # => 2

Bu Ruby doğrudan putsler eklendi () çalıştırmak vardı——IRB ek işlevselliği ile çatışan kaçının.

Bu davranış, herhangi bir belge üzerinde herhangi bir yere (kuşkusuz aramak için kolay bir şey değil) bulamıyorum olarak kendi deney sonucu olsa. Sonuçta, bu tüm iyi _ özel olduğunu tam olarak anlayabiliyorum aslında nasıl çalıştığını merak ediyorum. Belgeler, ve, tercihen, Ruby kaynak kodu (ve belki de RubySpec) başvurular için soruyorum _ Ruby nasıl davranacağını ortaya koyuyor.

Not: bu en @Niklas B. 35 *dışarı çıktı

CEVAP
5 Mart 2012, PAZARTESİ


"Değişken" hata. aynı adın bir kopyası bastırmak için kaynağı bazı özel işlem yok Hata iletisiparse.y, the 1.9.3 version looks like this: içinde sadece shadowing_lvar_gen görünür

static ID
shadowing_lvar_gen(struct parser_params *parser, ID name)
{
    if (idUScore == name) return name;
    /* ... */

ve idUScore böyle defined in id.c

REGISTER_SYMID(idUScore, "_");

warn_unused_var benzer özel işlem görürsünüz.

static void
warn_unused_var(struct parser_params *parser, struct local_vars *local)
{
    /* ... */
    for (i = 0; i < cnt;   i) {
        if (!v[i] || (u[i] & LVAR_USED)) continue;
        if (idUScore == v[i]) continue;
        rb_compile_warn(ruby_sourcefile, (int)u[i], "assigned but unused variable - %s", rb_id2name(v[i]));
    }
}

Uyarı for döngünün ikinci satırda bastırılmış olduğunu göreceksiniz.

Yinelenen ad hatası bastırılmış ve kullanılmayan değişken uyarı bastırılır. 1.9.3 kaynağı yukarıda bulabilirsiniz olabilirim _ sadece özel kullanım: Bu iki şey, _ dışında diğerleri gibi sadece düz eski bir değişken. (Küçük) özel _ ile ilgili herhangi bir belge bilmiyorum.

Ruby warn_unused_var 2.0 idUScore == v[i] test is_private_local_id bir çağrı ile değiştirilir:

if (is_private_local_id(v[i])) continue;
rb_warn4S(ruby_sourcefile, (int)u[i], "assigned but unused variable - %s", rb_id2name(v[i]));

is_private_local_id _ ile başlayan değişkenler için uyarılar bastırır:

if (name == idUScore) return 1;
/* ... */
return RSTRING_PTR(s)[0] == '_';

sadece 31* *kendisi yerine. 2.0 biraz gevşetir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Le

    Anthony Le

    10 EKİM 2006
  • HowtoDrawAndPaint

    HowtoDrawAnd

    24 EKİM 2010
  • placeboing

    placeboing

    7 Mart 2006