Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 46097
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 10, 20262026-05-10T15:54:45+00:00 2026-05-10T15:54:45+00:00

Ruby setters—whether created by (c)attr_accessor or manually—seem to be the only methods that need

  • 0

Ruby setters—whether created by (c)attr_accessor or manually—seem to be the only methods that need self. qualification when accessed within the class itself. This seems to put Ruby alone the world of languages:

  • All methods need self/this (like Perl, and I think Javascript)
  • No methods require self/this is (C#, Java)
  • Only setters need self/this (Ruby?)

The best comparison is C# vs Ruby, because both languages support accessor methods which work syntactically just like class instance variables: foo.x = y, y = foo.x . C# calls them properties.

Here’s a simple example; the same program in Ruby then C#:

class A   def qwerty; @q; end                   # manual getter   def qwerty=(value); @q = value; end   # manual setter, but attr_accessor is same    def asdf; self.qwerty = 4; end        # 'self.' is necessary in ruby?   def xxx; asdf; end                    # we can invoke nonsetters w/o 'self.'   def dump; puts 'qwerty = #{qwerty}'; end end  a = A.new a.xxx a.dump 

take away the self.qwerty =() and it fails (Ruby 1.8.6 on Linux & OS X). Now C#:

using System;  public class A {   public A() {}   int q;   public int qwerty {     get { return q; }     set { q = value; }   }   public void asdf() { qwerty = 4; } // C# setters work w/o 'this.'   public void xxx()  { asdf(); }     // are just like other methods   public void dump() { Console.WriteLine('qwerty = {0}', qwerty); } }  public class Test {   public static void Main() {     A a = new A();     a.xxx();     a.dump();   } } 

Question: Is this true? Are there other occasions besides setters where self is necessary? I.e., are there other occasions where a Ruby method cannot be invoked without self?

There are certainly lots of cases where self becomes necessary. This is not unique to Ruby, just to be clear:

using System;  public class A {   public A() {}   public int test { get { return 4; }}   public int useVariable() {     int test = 5;     return test;   }   public int useMethod() {     int test = 5;     return this.test;   } }  public class Test {   public static void Main() {     A a = new A();     Console.WriteLine('{0}', a.useVariable()); // prints 5     Console.WriteLine('{0}', a.useMethod());   // prints 4   } } 

Same ambiguity is resolved in same way. But while subtle I’m asking about the case where

  • A method has been defined, and
  • No local variable has been defined, and

we encounter

qwerty = 4 

which is ambiguous—is this a method invocation or an new local variable assignment?


@Mike Stone

Hi! I understand and appreciate the points you’ve made and your example was great. Believe me when I say, if I had enough reputation, I’d vote up your response. Yet we still disagree:

  • on a matter of semantics, and
  • on a central point of fact

First I claim, not without irony, we’re having a semantic debate about the meaning of ‘ambiguity’.

When it comes to parsing and programming language semantics (the subject of this question), surely you would admit a broad spectrum of the notion ‘ambiguity’. Let’s just adopt some random notation:

  1. ambiguous: lexical ambiguity (lex must ‘look ahead’)
  2. Ambiguous: grammatical ambiguity (yacc must defer to parse-tree analysis)
  3. AMBIGUOUS: ambiguity knowing everything at the moment of execution

(and there’s junk between 2-3 too). All these categories are resolved by gathering more contextual info, looking more and more globally. So when you say,

‘qwerty = 4’ is UNAMBIGUOUS in C# when there is no variable defined…

I couldn’t agree more. But by the same token, I’m saying

‘qwerty = 4’ is un-Ambiguous in ruby (as it now exists)

‘qwerty = 4’ is Ambiguous in C#

And we’re not yet contradicting each other. Finally, here’s where we really disagree: Either ruby could or could not be implemented without any further language constructs such that,

For ‘qwerty = 4,’ ruby UNAMBIGUOUSLY invokes an existing setter if there
is no local variable defined

You say no. I say yes; another ruby could exist which behaves exactly like the current in every respect, except ‘qwerty = 4’ defines a new variable when no setter and no local exists, it invokes the setter if one exists, and it assigns to the local if one exists. I fully accept that I could be wrong. In fact, a reason why I might be wrong would be interesting.

Let me explain.

Imagine you are writing a new OO language with accessor methods looking like instances vars (like ruby & C#). You’d probably start with conceptual grammars something like:

  var = expr    // assignment   method = expr // setter method invocation 

But the parser-compiler (not even the runtime) will puke, because even after all the input is grokked there’s no way to know which grammar is pertinent. You’re faced which a classic choice. I can’t be sure of the details, but basically ruby does this:

  var = expr    // assignment (new or existing)   // method = expr, disallow setter method invocation without . 

that is why it’s un-Ambiguous, while and C# does this:

  symbol = expr // push 'symbol=' onto parse tree and decide later                 // if local variable is def'd somewhere in scope: assignment                 // else if a setter is def'd in scope: invocation 

For C#, ‘later’ is still at compile time.

I’m sure ruby could do the same, but ‘later’ would have to be at runtime, because as ben points out you don’t know until the statement is executed which case applies.

My question was never intended to mean ‘do I really need the ‘self.’?’ or ‘what potential ambiguity is being avoided?’ Rather I wanted to know why was this particular choice made? Maybe it’s not performance. Maybe it just got the job done, or it was considered best to always allow a 1-liner local to override a method (a pretty rare case requirement) …

But I’m sort of suggesting that the most dynamical language might be the one which postpones this decision the longest, and chooses semantics based on the most contextual info: so if you have no local and you defined a setter, it would use the setter. Isn’t this why we like ruby, smalltalk, objc, because method invocation is decided at runtime, offering maximum expressiveness?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. 2026-05-10T15:54:46+00:00Added an answer on May 10, 2026 at 3:54 pm

    The important thing to remember here is that Ruby methods can be (un)defined at any point, so to intelligently resolve the ambiguity, every assignment would need to run code to check whether there is a method with the assigned-to name at the time of assignment.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Ask A Question

Stats

  • Questions 76k
  • Answers 76k
  • Best Answers 0
  • User 1
  • Popular
  • Answers
  • Editorial Team

    How to approach applying for a job at a company ...

    • 7 Answers
  • Editorial Team

    How to handle personal stress caused by utterly incompetent and ...

    • 5 Answers
  • Editorial Team

    What is a programmer’s life like?

    • 5 Answers
  • added an answer add $('#test').hide(); in your javascript: <script type='text/javascript'> $(document).ready(function(){ $('#test').hide(); $('#click_test').stop(function(event){… May 11, 2026 at 3:12 pm
  • added an answer You don't say whether pUpdateStudentStatus is under your control or… May 11, 2026 at 3:12 pm
  • added an answer You can use a hidden input element inside a form.… May 11, 2026 at 3:12 pm

Related Questions

I'm looking for Ruby's Active record for PHP. Something that is so simple that
When I am making methods with return values, I usually try and set things
Let's say I have a Ruby class: class MyClass def self.property return someVal end
I couldn't really find this in Rails documentation but it seems like 'mattr_accessor' is

Trending Tags

analytics british company computer developers django employee employer english facebook french google interview javascript language life php programmer programs salary

Top Members

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.