2013-05-30 3 views
0

У меня есть много строковых переменных, которые начинаются с «Вопрос», а затем заканчиваются номером. («Question1») В каждой переменной есть вопрос («Сколько раз он говорит?») На сцене есть редактируемое текстовое поле, в котором пользователь вводит номер вопроса, который он хочет отображать в другом текстовое окно. («1») Когда пользователь нажимает кнопку, я хочу, чтобы текст Question1 должен отображаться в текстовом поле. Мой код выглядит следующим образом:Как слить содержимое двух переменных

var Question1:String = "How many times does it say E?" ; 
var Question2:String = "How many times does it say B?" ; 
var Question3:String = "How many times does it say A?" ; 

myButton.addEventListener(MouseEvent.CLICK, displayQuestion); 

function displayQuestion(event:MouseEvent):void 
{ 
    var QuestionNumber:Number = Number(userInputQuestionNumber.text); 

    textBoxDisplayQuestion.text= Question(QuestionNumber); 
} 

Как я могу получить textBoxDisplayQuestion, чтобы отобразить фактический текст вопроса ?? (код я есть сейчас, очевидно, не работает !!)

Но этот пример не кажется, работает: я создал класс под названием Вопрос и вот код:

import Question; 
var QuNoLoad:Number; 
var Qu1:Question = new Question(1,"how","yes","no","maybe","so","AnsB","AnsA"); 

trace(Qu1.QuNo, Qu1.Qu, Qu1.AnsA,Qu1.AnsB, Qu1.AnsC, Qu1.AnsD, Qu1.CorAns, Qu1.FaCorAns); 

//the following is the code for the button 
loadQu.addEventListener(MouseEvent.CLICK, loadQuClick); 

function loadQuClick(event:MouseEvent):void 
{ 
    //this sets the variable "QuNoLoad" with the contents of the "textBoxQuLoad" 
    //imagine the user inputed "1" 
    QuNoLoad=Number(textBoxQuLoad.text); 

    //this SHOULD!! display the contents of "Qu1.Qu" 
    textQu.text= this["Qu"+QuNoLoad.toString()+".Qu"] 
    //and when i traced this statment the value was "undefined" 
} 

Почему ?? ?

ответ

1

Это довольно фундаментальное понятие в программировании, что будет делать много вещей труднее сделать, пока вы не поймете, это хорошо, и это довольно трудно объяснить, не начиная с некоторыми наработками:

Что здесь происходит легче говорить с обычной старой Object, а не классов, так что давайте начнут с очень простым примером:

var question1:Object = new Object(); 
question1.number = 1; 

Обратите внимание, что с Object вам не нужно было говорить, что number существовал раньше времени, он создается, когда вы его устанавливаете. Теперь, когда вы говорите либо question1.number, вы получаете 1, очевидно. То, что происходит, однако, что первый question1 получает значение вы хранящиеся в переменных question1 (который { number: 1 }), то .number получает значение, хранящееся в собственностиnumber, хранящейся в этом значении: 1.

Чтобы сэкономить печатать, вы можете использовать сокращенную запись под названием «объектные литералы»:

var question1 = { 
    number: 1 
}; 

Теперь давайте попробуем более сложный объект:

var question1 = { 
    number: 1, 
    text: "How many times does it say A?", 
    answers: { 
     a: 1, 
     b: 2, 
     c: 3, 
     d: 4, 
     correct: "b" 
    } 
}; 

Теперь question1 это объект, который имеет 3 свойства, один из которых, answers, является объектом с 5 объектами: a, b, c, d и correct.Это также можно написать так:

var question1 = new Object(); 
question1.number = 1; 
question1.text = "How many times does it say A?"; 
question1.answers = new Object(); 
question1.answers.a = 1; 
question1.answers.b = 2; 
question1.answers.c = 3; 
question1.answers.d = 4; 
question1.answers.correct = "b"; 

Должно быть ясно, почему буквальный синтаксис существует сейчас!

На этот раз, если вы говорите question1.answers.correct вы получаете "b": первый question1 получает вас значение { number: 1, ... }, то .answers получает значение { a: 1, b: 2, ... }, затем, наконец, .correct получает значение "b".

Вы также должны знать, что this специальная переменная, которая имеет особое значение в ActionScript (и JavaScript, на котором она основана): она широко относится к объекту, когда код, который вы пишете внутри: для «глобального» кода (не внутри a function), var добавляет свойства этому объекту: var number = 2; и this.number = 2 здесь. (Это не верно, когда вы находитесь в function, this ведет себя по-разному там, иногда в очень странным образом, так что будьте осторожны!)

Теперь вы можете начать видеть, что происходит: когда вы используете [], например, question1["number"], а не question1.number, вы передаете имя свойства, которое хотите получить как Stringзначение, что означает, что вы можете изменить какое свойство вы получаете во время работы, а не при компиляции («runtime» vs. «compiletime» "), но это также позволяет вам получать свойства с именами, с которыми вы не можете ссылаться с синтаксисом .!

var strange = { 
    "a strange name? That's OK!": 1 
}; 
trace(strange["a strange name? That's OK!"]); 

Так что, когда вы пишете this["Qu" + QuNoLoad.toString() + ".QuNo"], вы создаете имя как "Qu2.QuNo", например, вы пытаетесь получить свойство с таким точным названием, . включен, который не существует! То, что вы пытались сделать эквивалентом: Qu2.QuNo может быть написано как this["Qu" + QuNoLoad].QuNo.

Я не должен оставить это, не говоря, однако, что-то вроде этого, я хотел бы использовать массивы, которые существуют, так что вы можете использовать одно имя для хранения списка значений:

var questions:Array = [ // set questions to an array with multiple questions 
    new Question(...), 
    new Question(...), 
    ... 
]; 

for each (var question:Question in questions) { // Look at each question in the array 
    if (question.QuNo == textBoxQuLoad.text) { // If this is the right question 
     loadQuestion(question); 
     break; // Found it, stop looking at each question by "breaking out" of the for each 
    } 
} 

Есть много больше, что вы можете сделать с массивами, поэтому читайте их, когда вы получите время.

+0

Спасибо тонну! Очень ясно!! – user2434923

2

Вы можете ссылаться на переменную по имени, используя квадратные скобки [] оператора, такие как:

this["Question" + QuestionNumber.toString()] 

Вы можете использовать этот оператор динамически устанавливать и извлекать значения для свойства объекта.

Сохраняя номер вопроса как целое, ваша функция будет:

var Question1:String = "How many times does it say E?" ; 
var Question2:String = "How many times does it say B?" ; 
var Question3:String = "How many times does it say A?" ; 

function displayQuestion(event:MouseEvent):void 
{ 
    var QuestionNumber:uint = uint(userInputQuestionNumber.text); 

    textBoxDisplayQuestion.text = this["Question" + QuestionNumber.toString()]; 
} 
+0

Спасибо, это сработало. – user2434923

+0

Но новый пример (выше) не работает !!? – user2434923

+0

Вы не можете иметь период '.' в имени переменной. Если это член, то вы хотите: 'this [" Qu "+ QuNoLoad.toString()]. ​​Qu' Задайте новый вопрос вместо того, чтобы расширять существующий вопрос. –

Смежные вопросы